WebBrowser控件的内存泄漏问题

5

我在WebBrowser控件上遇到了内存泄漏的问题。

我找到了这个帖子:

如何解决.NET Webbrowser控件中的内存泄漏问题?

还有这个:

//dispose to clear most of the references
this.webbrowser.Dispose();
BindingOperations.ClearAllBindings(this.webbrowser);

//using reflection to remove one reference that was not removed with the dispose 
var field = typeof(System.Windows.Window).GetField("_swh", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

var valueSwh = field.GetValue(mainwindow);

var valueSourceWindow = valueSwh.GetType().GetField("_sourceWindow", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(valueSwh);

var valuekeyboardInput = valueSourceWindow.GetType().GetField("_keyboardInputSinkChildren", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(valueSourceWindow);

System.Collections.IList ilist = valuekeyboardInput as System.Collections.IList;

lock(ilist)
{
    for (int i = ilist.Count-1; i >= 0; i--)
    {
        var entry = ilist[i];
        var sinkObject = entry.GetType().GetField("_sink", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        if (object.ReferenceEquals(sinkObject.GetValue(entry), this.webbrowser.webBrowser))
        {
            ilist.Remove(entry);
        }
    }
} 

但我使用的是 Windows.Forms 而不是 WPF 窗口,我在将这段代码转换为我的需要时遇到了问题。有人可以帮助我吗?


你确定WinForms有泄漏吗? - SLaks
是的,我正在监视我的应用程序使用的物理内存。它在不断增长(虽然不快但仍在增长)。我的应用程序只是一个浏览器,浏览大量页面。 - Yozer
你使用这个解决方案的确切问题是什么? - nestedloop
可能是重复问题 如何解决.NET Webbrowser控件中的内存泄漏问题?。请阅读Sergey Kostrukov的答案。 - Samy S.Rathore
3个回答

3
我们在几个应用程序中使用了 Chromium。这使我们能够在WinXP上运行HTML 5。由于webBrowser控件使用操作系统中安装的IE,因此您无法使用大多数更好的HTML / Javascript。Microsoft不支持WinXP的IE,因此该应用程序只能访问旧版本的IE。
如果您使用CEFSharp版本的Chromium,甚至可以编译更多的修改和辅助功能以进行导航,从而为您提供了不受IE支持的改进嵌入式通信。
代码非常简单,并且有几个示例,但是请看:
InitializeComponent();
Text = "CefSharp";

web_view = new WebView("https://github.com/perlun/CefSharp", new BrowserSettings());
web_view.Dock = DockStyle.Fill;
toolStripContainer.ContentPanel.Controls.Add(web_view);
//even setup the console to log to a Textbox for debugging by setting up a Handler.
web_view.ConsoleMessage += new CefSharp.ConsoleMessageEventHandler(ConsoleMessageHandler);

3
我们一段时间前也遇到了这个问题,但无济于事。
为了解决这个问题并保持应用程序的内存消耗在合理水平,我们决定将应用程序分为两种进程,一个是主窗口进程,另外N个子进程用于托管WebBrowserControl。然后,设计一个管道协议(或类似RMI/RPC)来在主窗口和子进程之间通信事件。
这样做,你可以使用浏览器进程池和后台Kill-and-Spawn策略来设计回收策略,以控制内存消耗水平。

1

你考虑过使用其他的网页浏览器控件吗?市场上有很多选择!我认为Chromium是一个不错的选择,可以查看这个问题以了解其他的替代方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接