[英]Application.DoEvents memory leak?
我正在瀏覽網站列表並抓住他們的內容。 我這樣做是首先將網頁作為字符串,然后嘗試通過其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。 我正在瀏覽幾千頁,所以在很短的時間內使用數百個megs找到我的程序有點令人擔憂。
是否有一個更簡單的解決方案從站點獲取完整的HTML文檔,允許在不泄漏內存的情況下進行代碼內DOM遍歷?
應用程序關閉時內存是否無法釋放? 我希望在下載頁面時內存使用率會增加。
我懷疑Application.DoEvents()
存在內存泄漏但確實有一個更簡單的相對輕量級選項:使用HtmlagilityPack代替,這將使您能夠執行所需的所有HTML解析而無需實例化WebBrowser
對象。
我希望在將頁面加載到WebBrowser控件中時使用內存。 如果內存永遠不會釋放,那只是內存泄漏; 考慮到IE的復雜性,我不想猜測何時會釋放內存。
是否有一個更簡單的解決方案從一個允許代碼內DOM的網站抓取一個完整的HTML文檔?
要從內存中的HTML頁面中提取內容,而不先將其加載到WebBrowser控件中,請嘗試使用HTML Agility Pack: http : //htmlagilitypack.codeplex.com/
您可以使用HTML Agility Pack來實現您正在尋找的結果。 順便說一句,我懷疑它是漏網的Web瀏覽器控件 - 如果控件沒有完全加載並且你加載其他東西,它只會泄漏前一頁的內存(恕我直言)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.