Application.DoEvents内存泄漏?

时间:2011-02-21 16:06:55

标签: c# html memory-leaks

我正在查看网站列表并抓住他们的内容。我这样做是首先将网页作为字符串,然后尝试通过其DocumentText属性将其推送到System.Windows.Forms.WebBrowser对象。

以下是代码的一部分:

if (!String.IsNullOrEmpty(siteAddress))
                webReq = WebRequest.Create(siteAddress);

            WebResponse webRes = webReq.GetResponse();

            Stream streamResponse = webRes.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
            Char[] readBuff = new Char[256];
            int count = streamRead.Read(readBuff, 0, 256);
            string fullHTML = "";
            while (count > 0)
            {
                String outputData = new String(readBuff, 0, count);
                fullHTML += outputData;
                count = streamRead.Read(readBuff, 0, 256);
            }

            //Close the Stream object.
            streamResponse.Close();
            streamRead.Close();

            //Release the HttpWebResponse Resource.
            webRes.Close();

            //Convert string to HTML document                
            WebBrowser webControl = new WebBrowser();
            webControl.ScriptErrorsSuppressed = true;
            webControl.DocumentText = fullHTML;
            do
            {
                Application.DoEvents();
            } while (webControl.ReadyState != WebBrowserReadyState.Complete);

这种方法有用 - 我可以通过过滤标签来拆分HTML等等。正如主题名所暗示的那样,问题是存在某种类型的内存泄漏,特别是在Application.DoEvents()循环期间。有谁知道发生了什么?在完成do循环之前,内存使用量不会增加太多,然后RAM使用率会上升大约800kb。我正在浏览几千页,所以在很短的时间内使用数百个meg找到我的程序有点令人担忧。

是否有更简单的解决方案从站点获取完整的HTML文档,允许在不泄漏内存的情况下进行代码内DOM遍历?

4 个答案:

答案 0 :(得分:1)

应用程序关闭时内存是否无法释放?我希望在下载页面时内存使用量会增加。

答案 1 :(得分:1)

我怀疑Application.DoEvents()存在内存泄漏,但确实有一个更简单的相对轻量级选项:使用HtmlagilityPack代替,这将使您能够进行所需的所有HTML解析而无需实例化WebBrowser对象。

答案 2 :(得分:1)

我希望在将页面加载到WebBrowser控件中时使用内存。如果内存永远不会释放,那只是内存泄漏;考虑到IE的复杂性,我不想猜测该内存何时会被释放。

  

是否有更简单的解决方案从允许代码内DOM的网站中获取完整的HTML文档?

要从内存中的HTML页面中提取内容,而不先将其加载到WebBrowser控件中,请尝试使用HTML Agility Pack:http://htmlagilitypack.codeplex.com/

答案 3 :(得分:1)

您或许可以使用HTML Agility Pack来实现您正在寻找的结果。顺便说一下,我怀疑它是漏网的Web浏览器控件 - 如果控件没有完全加载而你加载其他东西,它只会泄漏上一页的内存(恕我直言)。