Утечка памяти в WPF после создания окна в другом потоке - PullRequest
1 голос
/ 30 октября 2010

Я создаю окно в другой теме. После закрытия потока некоторые ресурсы окна не освобождаются из памяти. Из-за этого растет счетчик GDI Objects и User Objects в диспетчере задач Windows. Графика, которая не выпущена, является шрифтом и областью. Понятия не имею, что происходит ...

public class WaitingWindowManager
{
    private Thread thread;
    private bool canAbortThread = false;
    private Window waitingWindow;

    public void BeginWaiting()
    {
        this.thread = new Thread(this.RunThread);
        this.thread.IsBackground = true;
        this.thread.SetApartmentState(ApartmentState.STA);
        this.thread.Start();
    }

    public void EndWaiting()
    {
        if (this.waitingWindow != null)
        {
            this.waitingWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() => { this.waitingWindow.Close(); }));
            while (!this.canAbortThread) { };
        }

        this.thread.Abort(); 
    }

    public void RunThread()
    {
        this.waitingWindow = new Window();
        this.waitingWindow.Closed += new EventHandler(waitingWindow_Closed);
        this.waitingWindow.ShowDialog();
    }

    void waitingWindow_Closed(object sender, EventArgs e)
    {
        this.canAbortThread = true;
    }
}

И звоните:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();  
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
            WaitingWindowManager waitingWindowManager = new WaitingWindowManager();
            waitingWindowManager.BeginWaiting();
            Application.Current.Dispatcher.Thread.Join(5000);
            waitingWindowManager.EndWaiting();
    }
}

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

Удалите ваш закрытый обработчик событий в вашем событии waitWindow_Closed.Это заставляет ваше окно не утилизироваться.Если вы добавляете события вручную, вам нужно убедиться, что вы удалили их после завершения.

Я также заметил еще один Stackoverflow вопрос , касающийся утечек памяти в wpf.Он ссылался на эту статью , может быть, это поможет вам.

0 голосов
/ 30 октября 2010

Добавьте Dispatcher.CurrentDispatcher.InvokeShutdown(); в свой код закрытия.Это должно позаботиться о любой утечке памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...