Создание нового окна и его закрытие приводит к утечке памяти - PullRequest
0 голосов
/ 01 апреля 2012

Я создаю новые окна с помощью приведенного ниже кода и отображаю веб-страницу, а затем закрываю ее. Но через некоторое время программное обеспечение выдает из памяти исключение. Так что происходит утечка памяти. В чем может быть причина и как ее решить? Спасибо.

Вот так я могу начать новое окно. Я делаю цикл, поэтому запускаются тысячи новых окон. Как видите, через 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 Ответ

3 голосов
/ 01 апреля 2012

Я сразу подозреваю, что WebBrowser элемент управления не высвобождает свои ресурсы , когда окно закрывается как , вы не вызываете , это Dispose() метод. Элемент управления WebBrowser представляет собой тонкую оболочку вокруг элемента управления ActiveX MSHTML.

Добавьте обратный вызов в окно Closing или Closed событий, чтобы сделать это. например webnew.Dispose().

...