Создание нового окна и его закрытие приводит к утечке памяти
Я создаю новые окна с помощью приведенного ниже кода и отображаю веб-страницу, а затем закрываю ее. Но через некоторое время программное обеспечение выдает из памяти исключение. Так что происходит утечка памяти. В чем может быть причина и как ее решить? Спасибо.
Вот как я могу начать новое окно. Я делаю цикл, поэтому запускаются тысячи новых окон. Как вы видите, через 60 секунд новое окно закрывается.
NewWindowThread<TitleWindow, string>(c => new TitleWindow(c), "the url that is going to be displayed at new window");
private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window
{
Thread thread = new Thread(() =>
{
T w = constructor(param);
w.Show();
w.Closed += (sender, e) => w.Dispatcher.InvokeShutdown();
System.Windows.Threading.Dispatcher.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
public class TitleWindow : Window
{
WebBrowser webnew = new WebBrowser();
public TitleWindow(string srUrl)
{
DockPanel dk = new DockPanel();
dk.Width = 900;
dk.Height = 600;
this.AddChild(dk);
webnew.Navigated += new NavigatedEventHandler(wbMain_Navigated);
System.Windows.Threading.DispatcherTimer dispatcherTimer3 = new System.Windows.Threading.DispatcherTimer();
dispatcherTimer3.Tick += new EventHandler(dispatcherTimer_Tick3);
dispatcherTimer3.Interval = new TimeSpan(0, 0, 0, 60, 0);
dispatcherTimer3.Start();
webnew.Height = 600;
webnew.Width = 900;
dk.Children.Add(webnew);
webnew.Navigate(srUrl);
this.WindowState = WindowState.Minimized;
}
void dispatcherTimer_Tick3(object sender, EventArgs e)
{
this.Close();
}
}
1 ответ
Решение
Я сразу подозреваю, что WebBrowser
контроль не высвобождает свои ресурсы, когда окно закрыто, так как вы не вызываете его Dispose()
метод. WebBrowser
control - это тонкая оболочка вокруг элемента управления ActiveX MSHTML.
Добавить обратный звонок в окне Closing
или же Closed
события, чтобы сделать это. например webnew.Dispose()
,