【问题标题】:Creating new window then closing it causes memory leak创建新窗口然后关闭它会导致内存泄漏
【发布时间】:2012-04-15 12:43:58
【问题描述】:

我正在通过下面的代码生成新窗口并在那里显示一个网页,然后将其关闭。但过了一会儿,软件给出了内存不足的异常。所以发生了内存泄漏。可能是什么原因以及如何解决?谢谢。

这是我如何启动新窗口。我正在做一个循环,因此正在启动数千个新窗口。如您所见,新窗口在 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();
    }
}

【问题讨论】:

  • 如果有“数千个新窗口”,你只是内存不足(并且没有内存泄漏)。
  • 你试过什么?为什么不直接使用内存分析器来解决这个问题?
  • 你必须打开数千个窗口的可能原因是什么?
  • 不会同时有数千个窗口 :) 就像我在显示 20000 个网站一样。所以它从1开始打开它。 60 秒后,每个窗口都会关闭。同时有 60 或 90 个窗口,这取决于我打开的速度。如果我给间隔 1 秒,则同时打开 60 个窗口。

标签: c# wpf memory-leaks out-of-memory new-window


【解决方案1】:

我立即怀疑WebBrowser 控件在关闭窗口时没有释放它的资源,因为你没有调用它是Dispose() 方法。 WebBrowser 控件是 ActiveX MSHTML 控件的薄包装。

在窗口ClosingClosed 事件上添加回调来执行此操作。例如webnew.Dispose()

【讨论】:

  • 确实,关闭一个窗口是不够的。那时它还没有消失。
  • 也非常感谢。但是随着时间的流逝和软件运行,内存使用量不断增加:(我认为它仍然不够。仍然没有以某种方式正确释放内存。软件的其余部分非常简单。只是一个打开新窗口的循环。所以它不是问题。
  • 在哪里?在您发布的示例代码中,我看不到您已尝试过此操作。你可能有不止一个问题。您安装了哪个版本的 Windows 和 Internet Explorer?
  • 尝试使用 windows 7 Ultimate sp1 和 internet explorer 9。另外添加 dispose 在长时间运行后会出现另一个错误。 img72.imageshack.us/img72/3622/errorbh.png
猜你喜欢
  • 2011-08-26
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
相关资源
最近更新 更多