【发布时间】: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