我正在浏览一个网站列表,抓取它们的内容。为此,我首先将网页作为字符串获取,然后尝试通过其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循环之前,内存使用量不会增加很多,然后内存使用量会增加大约800kb。我正在浏览几千页,所以发现我的程序在短时间内使用了数百个兆,这有点令人担忧。
有没有一种更简单的解决方案,可以从站点获取完整的HTML文档,允许在不泄漏内存的情况下进行代码内DOM遍历?
发布于 2011-02-22 00:14:00
您也许能够使用HTML Agility Pack来实现您想要的结果。顺便说一下,我怀疑是web浏览器控件在泄漏-如果控件没有完全加载,而你加载了其他东西,它只会泄漏前一页的内存(IMHO)。
发布于 2011-02-22 00:09:39
当你的应用程序关闭时内存不会释放吗?当页面被下载时,我预计内存使用量会增加。
发布于 2011-02-22 00:10:45
我怀疑Application.DoEvents()是否存在内存泄漏,但确实有一个简单得多的相对轻量级的选择:使用HtmlagilityPack,这将使您能够执行所需的所有WebBrowser解析,而不必实例化WebBrowser对象。
https://stackoverflow.com/questions/5068221
复制相似问题