Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Уничтожить Window после завершения потока

#c_sharp #wpf #многопоточность


Есть метод Something я его запускаю 100500 раз, однако объект System.Windows.Window
не исчезает из памяти. 

private void Something()
{
  Thread t = new Thread(()=> {
    Window w = new Window() { Width = 1024, Height = 768 };
    w.Show();
    Thread.Sleep(1000);
    w.Close();
  });
  t.SetApartmentState(ApartmentState.STA);
  t.Priority = ThreadPriority.Normal;
  t.Start();
  GC.Collect();
}

    


Ответы

Ответ 1



Открывать окно в собственном потоке - не очень хорошая идея, обычно в поток выделяют только вычисления. Однако, в данном примере память будет освобождаться, если подписаться на событие Closed окна и вызвать Dispatcher.CurrentDispatcher.BeginInvokeShutdown, а после закрытия окна вызвать Dispatcher.Run. В реальном использовании Dispatcher.Run вызывается после открытия окна, а закрытие происходит по действию пользователя, а не программно. private void Something() { var t = new Thread(() => { var w = new Window() { Width = 1024, Height = 768 }; w.Show(); w.Closed += (s, ex) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background); Thread.Sleep(1000); w.Close(); Dispatcher.Run(); }); t.SetApartmentState(ApartmentState.STA); t.Priority = ThreadPriority.Normal; t.Start(); GC.Collect(); } Информация отсюда.

Комментариев нет:

Отправить комментарий