我正在查看网站列表并抓住他们的内容。我这样做是首先将网页作为字符串,然后尝试通过其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遍历?
答案 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浏览器控件 - 如果控件没有完全加载而你加载其他东西,它只会泄漏上一页的内存(恕我直言)。