【问题标题】:How to release memory whilst navigating web documents using a Windows.Forms.WebBrowser control如何在使用 Windows.Forms.WebBrowser 控件导航 Web 文档时释放内存
【发布时间】:2012-04-11 01:03:38
【问题描述】:

以下代码在 Windows 窗体中运行,创建一个 WebBrowser 控件并导航到多个 URL。每次将 URL 导航到应用程序消耗的内存时,它都会增加并且似乎永远不会被释放。在我的情况下,仅导航 4 个文档,消耗的内存从 ~10 Mb 上升到 ~45 Mb。我需要浏览数百个文档,这很快就会导致所有物理内存都被使用。

如何释放 WebBrowser 控件使用的资源?

    private void ProcessDocs()
    {
        Random rnd = new Random();
        DateTime dtWaitUntil = DateTime.Now;
        string[] arrInputUrl = new string[] { "http://www.google.co.uk/", "http://www.google.com/", "http://www.yahoo.com/", "http://www.amazon.co.uk/" };

        for (int i = 0; i < arrInputUrl.Length; i++)
        {
            using (WebBrowser objWebBrowser = new WebBrowser())
            {
                string txtInputUrl = arrInputUrl[i];
                tboxTestingOutput.Text += "\r\n" + txtInputUrl;

                objWebBrowser.ScriptErrorsSuppressed = true;
                objWebBrowser.Navigate(txtInputUrl);

                //Should do this a better way, but, wait 10 secs for document to complete.
                //Would use objWebBrowser.DocumentCompleted event
                //but it seems to fire several times per document load!!!
                dtWaitUntil = DateTime.Now.AddSeconds(10);

                do
                {
                    Application.DoEvents();
                } while (DateTime.Now < dtWaitUntil);

                //Do whatever I need to with the document contents
                //...
                //...
            }
        }

        tboxTestingOutput.Text += "\r\nFinished";
    }

【问题讨论】:

  • 如果您只需要阅读网页内容,您是否考虑使用WebRequest 代替? (见msdn.microsoft.com/en-us/library/system.net.webrequest.aspx
  • 好吧,我们知道它消耗 45MB,这对于浏览器来说只是小菜一碟。我们不知道它崩溃时消耗了多少虚拟机。您是否真的等待了足够长的时间,或者您只是在猜测它只会继续上涨?这不是内存管理器的工作方式。
  • @MiMo 我使用 WebBrowser 导航到最终重定向页面,这可能是 HTTP 标头重定向、Javascript 重定向、SWF 重定向等的结果,其中许多不是由 WebRequest 处理的。
  • @Hans Passant 这是一个很好的观点。在发布问题之前,我切换到 using 语句。如果没有 'using' 语句,所有内存都被消耗掉了。现在只是测试。
  • 经过进一步测试@Hans Passant 是正确的。内存使用峰值约为 85%。我应该从一开始就使用“使用”语句。

标签: c# winforms browser webbrowser-control


【解决方案1】:

虽然我不会完全推荐它,但带有 -1 的 P/Invoke SetProcessWorkingSetSize 应该强制清空进程工作集,例如:

[DllImport("kernel32.dll")]
static extern bool SetProcessWorkingSetSize(IntPtr handle, int minSize, int maxSize);

SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,-1,-1);

在这里阅读更多:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 2013-03-29
    • 1970-01-01
    • 2018-08-26
    • 2018-09-07
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多