據MSDN,該System.Windows.Forms.WebBrowser控件是爲ActiveX WebBrowser控件託管包裝,並會使用任何版本的控件安裝在用戶的計算機上。
你可以找到的Dispose(布爾)在web瀏覽器類(在Visual Stuio按F12鍵)來釋放非託管資源的元數據方法。(不要將其())
代碼here
protected override void Dispose(bool disposing) {
if (disposing) {
if (htmlShimManager != null)
{
htmlShimManager.Dispose();
}
DetachSink();
ActiveXSite.Dispose();
}
base.Dispose(disposing);
}
但是,如果您嘗試調用WebBrowser.Dispose(bool),則會顯示編譯器錯誤CS1540。
WebBrowser類支持Dispose(bool)方法,但我們不能使用它。
我認爲WebBrowser類的設計是錯誤的。
我有一個想法來調用WebBrowser.Dispose(true)。
這很簡單!但它不是一個好方法。在這裏
示例代碼(3個按鈕和文本框1個需要)
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Test_20170308_01
{
public partial class Form1 : Form
{
[DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
public static void FlushMemory()
{
GC.Collect();
GC.WaitForPendingFinalizers();
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
}
}
public Form1()
{
InitializeComponent();
}
private void addWeb()
{
WebBrowserD webBrowser1 = new WebBrowserD();
webBrowser1.Size = new Size(1070, 585);
this.Controls.Add(webBrowser1);
webBrowser1.Navigate("about:blank");
}
private void RemoveWeb()
{
foreach (Control ctrl in this.Controls)
{
if (ctrl is WebBrowserD)
{
WebBrowserD web = (WebBrowserD)ctrl;
this.Controls.Remove(ctrl);
web.Navigate("about:blank");
web.Dispose(true);
FlushMemory();
}
}
}
private void button1_Click(object sender, EventArgs e)
{
addWeb();
}
private void button2_Click(object sender, EventArgs e)
{
RemoveWeb();
}
private void button3_Click(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
if (ctrl is WebBrowserD)
{
WebBrowserD axweb = (WebBrowserD)ctrl;
axweb.Navigate(textBox1.Text);
FlushMemory();
}
}
}
}
public class WebBrowserD : WebBrowser
{
internal void Dispose(bool disposing)
{
// call WebBrower.Dispose(bool)
base.Dispose(disposing);
}
}
}
此代碼,可以防止內存泄漏。
綜上所述, 你只需要一類。
public class WebBrowserD : WebBrowser
{
internal void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}
還有,如果你的事件處理程序添加到任何的導航元素的內存泄漏。爲了解決這個問題,你必須保留所有元素的字典(也包括頂級文檔),然後在OnDocumentCompleted()函數中,逐個刪除事件處理程序,同時在調用marshall.ReleaseComObject(o.DomDocument)循環,然後通過Marshal.ReleaseComObject(document.DomDocument)最終釋放頂層文檔。 – Brain2000 2017-04-10 17:07:40