台灣最大程式設計社群網站
線上人數
212
 
會員總數:246134
討論主題:189713
歡迎您免費加入會員
討論區列表 >> VB.NET >> vb.net 如何關閉 WebBrowser1.Navigate 開啟的視窗以歸還佔用記憶體
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
vb.net 如何關閉 WebBrowser1.Navigate 開啟的視窗以歸還佔用記憶體
價值 : 5 QP  點閱數:716 回應數:16
樓主

張亦群
門外漢
0 5
74 10
發送站內信

各位前輩好 我是 vb.net初學者

請問 vb.net 如何關閉 WebBrowser1.Navigate 開啟的視窗?

因為 必須用連續迴圈開啟幾百個不同視窗,WebBrowser1.Navigate視窗開啟後就會占用記憶體,連續開啟後占用的記憶體會急速累積,然後就跳出執行(因為記憶體不足)

請教各位前輩應該如何開完後關閉並釋出占用的記憶體?

請大家幫幫忙解答 謝謝


搜尋相關Tags的文章: [ vb ] , [ webbrowse ] , [ Navigate ] , [ 歸還佔用記憶體 ] ,
本篇文章發表於2020-01-05 06:12
1樓
回應

練武功
檢舉此回應
WebBrowser 控制項會耗用大量資源。 當您完成使用控制項時,請務必呼叫 Dispose() 方法,以確保所有資源都能及時釋放。 您必須在附加事件的相同執行緒上呼叫 Dispose() 方法,這應該一律是訊息或使用者介面(UI)執行緒。

參考:https://docs.microsoft.com/zh-tw/dotnet/api/system.windows.forms.webbrowser?view=netframework-4.8
本篇文章回覆於2020-01-05 11:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

張亦群
檢舉此回應
謝謝前輩指點 但是 我已經加了 似乎沒效果 偵錯時執行續記憶體一樣每開一次網頁 記憶體就增加100-200MB 大約連續開啟60-80個網頁之後 記憶體就占用4GB然後跳出程式 OUT OF MEMOEY

FOR I = 1 TO 200

WebBrowser1.Navigate("https://facebook.com/groups/" & id)

Application.DoEvents()

WebBrowser1.Dispose()

NEXT

似乎是每開一個網頁都開啟新的視窗 所以記憶體就隨網頁大小一直累積 無法釋放

請問我是否遺漏了麼?

再者

(1) 可以讓每次開起的網頁都是使用原開啟的視窗 而不開啟新視窗嗎? VB.NET 應該怎麼寫?

(2) 或是 在新開啟一個網頁視窗之前 下甚麼指令先關閉舊的視窗以釋放記憶體資源?


謝謝

本篇文章回覆於2020-01-05 12:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

練武功
檢舉此回應
1.根據你的測試程式,跑I=2就出現錯誤了,因為WebBrowser已經不見了,所以I=2以後就不能再使用WebBrowser1。所以你真正的程式碼應該不是這樣。還是要根據真正的程式碼才能推斷錯在哪裡。
2.你可以在WebBrowser1.Dispose()後面再加上一行指令:WebBrowser1=Nothing 試試看。
本篇文章回覆於2020-01-05 15:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

張亦群
檢舉此回應
FOR I = 1 TO 200

WebBrowser1.Navigate("about:blank")

WebBrowser1.Navigate("https://facebook.com/groups/" & id)

Application.DoEvents()

WebBrowser1.Dispose()

WebBrowser1 = Nothing

NEXT

加入這兩列任何一列都會在 I=2 第二輪執行 WebBrowser1.Navigate("about:blank")時出現 未處理的例外狀況 錯誤 system.NullReferenceException:'並未將物件參考設定為物件的執行個體'

WebBrowser1.Dispose()
WebBrowser1 = Nothing

只要將這兩列刪掉 就可以一直執行 但是 記憶體就會一直增加直到記憶體不足跳出程式

請前輩幫忙看一下問題在哪?
本篇文章回覆於2020-01-09 11:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

練武功
檢舉此回應
如果你是用同一個WebBrowser1進行Navigate,記憶體應該只會增加一個網頁的量,不會下載一個網頁就增加一個。
有這種情形發生,通常是一直重複WebBrowser1 = New WebBrowser。
如果你只是要解決上面 FOR I=1 TO 200的問題,只要再回圈內加上WebBrowser1 = New WebBrowser即可

如果你是要解決你的程式的問題,可能要找找看裡面有沒有重複的WebBrowser1 = New WebBrowser,或是把程式碼貼上,請大家看看問題。
本篇文章回覆於2020-01-09 16:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

張亦群
檢舉此回應
FOR I = 1 TO 200

WebBrowser1 = New WebBrowser

WebBrowser1.Navigate("about:blank")

WebBrowser1.Navigate("https://facebook.com/groups/" & id)

Application.DoEvents()

WebBrowser1.Dispose()

WebBrowser1 = Nothing

NEXT

加入WebBrowser1 = New WebBrowser這一列之後 不會再出現錯誤訊息

但是下面一列 WebBrowser1.Navigate("https://facebook.com/groups/" & id)顯示不同網頁內容的功能卻失效 不會再出現網頁內容

好像並沒有執行一樣 但是 執行續記憶體卻一樣顯示 被占用記憶體一直增加

請前輩幫忙看一下問題在哪?
本篇文章回覆於2020-01-09 21:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

練武功
檢舉此回應
你全部的程式碼就只有FOR----NEXT之間這幾行嗎?
本篇文章回覆於2020-01-09 22:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

張亦群
檢舉此回應
Dim testfile As StreamReader

WebBrowser1.Navigate("https://www.facebook.com/")

FOR I = 1 TO 200

test = ""
testfile = New StreamReader("testfile.txt") 'testfile.txt 放要測試開啟的社團id
test = testfile.ReadToEnd
testfile.Close()
testfile.Dispose()

For Each tmp As String In test.Lines

WebBrowser1 = New WebBrowser ' 後來加入 加入之後如上一篇所述

WebBrowser1.Navigate("about:blank")

WebBrowser1.Navigate("https://facebook.com/groups/" & id) '顯示指定ID的社團

Application.DoEvents()

WebBrowser1.Dispose()

WebBrowser1 = Nothing '後來加入

NEXT
NEXT

(1)
執行緒記憶體會在執行WebBrowser1.Navigate("https://facebook.com/groups/" & id)時一直增加 直到超過 4GB 就跳出程式

(2)
WebBrowser1 = New WebBrowser ' 後來加入 加入之後如上一篇所述 就不會更新webbrowser畫面 但是記憶體一樣增加

(3)
WebBrowser1.Dispose()
WebBrowser1 = Nothing '這兩列後來加入 加入後就會出現如上一篇所述錯誤訊息 加入這兩列任何一列都會在 I=2 第二輪執行 WebBrowser1.Navigate("about:blank")時出現 未處理的例外狀況 錯誤 system.NullReferenceException:'並未將物件參考設定為物件的執行個體'

(4) 這三列取消掉就是原來的程式 可以正常執行沒有錯誤訊息 但是執行緒記憶體一直增加直到跳出程式
WebBrowser1 = New WebBrowser
WebBrowser1.Dispose()
WebBrowser1 = Nothing

再煩請前輩幫忙看一下問題在哪? 謝謝
本篇文章回覆於2020-01-10 06:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

練武功
檢舉此回應
1.這個迴圈程式只是讓網頁讀入(不一定會讀入)後,瞬間刪除,所以頁面不會有變化。這個程式碼只能做為測試。
2.Dispose只能刪除WebBrowser控制項,但不能刪除網頁存在快取的資料,再加上網頁資料量很多,所以才會使記憶體爆掉。
3.要藉決這個問題,請參閱https://stackoverflow.com/questions/3421144/how-to-disable-caching-in-the-net-webbrowser-control
本篇文章回覆於2020-01-10 11:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

張亦群
檢舉此回應
Dim testfile As StreamReader

WebBrowser1.Navigate("https://www.facebook.com/")

FOR I = 1 TO 200

test = ""
testfile = New StreamReader("testfile.txt") 'testfile.txt 放要測試開啟的社團id
test = testfile.ReadToEnd
testfile.Close()
testfile.Dispose()

For Each tmp As String In test.Lines

WebBrowser1.Navigate("about:blank")

WebBrowser1.Navigate("https://facebook.com/groups/" & id) '顯示指定ID的社團

Application.DoEvents()

delay(3) '暫停大約3秒

NEXT
NEXT

這是原程式 只要暫停3-10秒 網頁是可以正常一篇篇顯示 就是記憶體占用超過 4GB 就跳出程式

再煩請前輩幫忙看一下問題在哪? 謝謝

https://stackoverflow.com/questions/3421144/how-to-disable-caching-in-the-net-webbrowser-control 因為我程度不夠 有些看不懂 請前輩幫我忙 直接用 VB.NET的指令 建議我應該再程式部分怎麼修改 才不會再占用記憶體一直累加?

謝謝

本篇文章回覆於2020-01-11 16:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

張亦群
檢舉此回應
Dim testfile As StreamReader

WebBrowser1.Navigate("https://www.facebook.com/")

FOR I = 1 TO 200

test = ""
testfile = New StreamReader("testfile.txt") 'testfile.txt 放要測試開啟的社團id
test = testfile.ReadToEnd
testfile.Close()
testfile.Dispose()

For Each tmp As String In test.Lines

WebBrowser1.Navigate("about:blank")

WebBrowser1.Navigate("https://facebook.com/groups/" & id) '顯示指定ID的社團

Application.DoEvents()

delay(3) '暫停大約3秒

NEXT
NEXT

這是原程式 只要暫停3-10秒 網頁是可以正常一篇篇顯示 就是記憶體占用超過 4GB 就跳出程式

再煩請前輩幫忙看一下問題在哪? 謝謝

https://stackoverflow.com/questions/3421144/how-to-disable-caching-in-the-net-webbrowser-control 因為我程度不夠 有些看不懂 請前輩幫我忙 直接用 VB.NET的指令 建議我應該再程式部分怎麼修改 才不會再占用記憶體一直累加?

謝謝

本篇文章回覆於2020-01-11 16:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

練武功
檢舉此回應

System.Diagnostics.Process.Start("rundll32.exe","InetCpl.cpl,ClearMyTracksByProcess 8")
這個指令放在迴圈的某處試試看。
本篇文章回覆於2020-01-11 16:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

張亦群
檢舉此回應
ystem.Diagnostics.Process.Start("rundll32.exe","InetCpl.cpl,ClearMyTracksByProcess 8")

這一列放入第一層或第二層迴圈 都可以讓執行緒記憶體累積占用的速度慢10%左右 所以 可以比原先多顯示很多個網頁 但是 並不會真正將記憶體歸還 讓累積佔用的執行緒記憶體變少 所以還是記會在憶體占用超過 4GB 就跳出程式

再煩請前輩幫忙想一下還有其他可以有效歸還記憶體的方式 或是 應該怎麼修改 謝謝

ps: 我一直想不通 並沒有一直用new開新的webbrowser 只是開新的網頁 應該會覆蓋掉舊的網頁資料 使用的記憶體應該可以控制 為什麼每開一次網頁記憶體就會累積增加?
本篇文章回覆於2020-01-12 16:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

練武功
檢舉此回應
你用6樓有new和dispose的程式碼試試看
本篇文章回覆於2020-01-12 17:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

張亦群
檢舉此回應
Dim testfile As StreamReader

WebBrowser1.Navigate("https://www.facebook.com/")

FOR I = 1 TO 200

test = ""
testfile = New StreamReader("testfile.txt") 'testfile.txt 放要測試開啟的社團id
test = testfile.ReadToEnd
testfile.Close()
testfile.Dispose()

For Each tmp As String In test.Lines

WebBrowser1 = New WebBrowser

WebBrowser1.Navigate("about:blank")

WebBrowser1.Navigate("https://facebook.com/groups/" & id) '顯示指定ID的社團

Application.DoEvents()

WebBrowser1.Dispose()

delay(3) '暫停大約3秒

NEXT
NEXT

加上以後 記憶體一樣一直增加 但是 WebBrowser1.Navigate("https://facebook.com/groups/" & id) 就不會顯示網頁了

再煩請前輩幫忙 應該怎麼修改 謝謝
本篇文章回覆於2020-01-12 22:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.