#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(); } Информация отсюда.
Комментариев нет:
Отправить комментарий