【问题标题】:WebBrowser control memory leakWebBrowser 控制内存泄漏
【发布时间】:2013-12-29 21:21:33
【问题描述】:

我在 webBrowser 控件中遇到内存泄漏问题。 我找到了这个帖子:

How to get around the memory leak in the .NET Webbrowser control?

还有这个:

//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 有漏洞吗?
  • 是的。我正在监视我的应用程序正在使用的物理内存。并且正在增长和增长(不快但仍然)。我的应用只是一个浏览大量页面的网络浏览器。
  • 阻止您使用此解决方案的确切问题是什么?
  • 可能重复 How to get around the memory leak in the .NET Webbrowser control?。阅读 Sergey Kostrukov 的回答。

标签: c# internet-explorer memory-leaks browser


【解决方案1】:

我们在几个应用程序中使用了Chromium。这使我们能够在 WinXP 中运行 HTML 5。由于webBrowser 控件使用已安装的操作系统IE,因此您无法使用大多数更好的HTML/Javascript。 Microsoft 不支持 WinXP 的 IE,因此该应用程序只能访问旧版本的 IE。

如果您使用 Chromium 的 CEFSharp 版本,您甚至可以为您的导航编译更多模块和辅助工具,从而改进 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);

【讨论】:

    【解决方案2】:

    我们前段时间遇到过这个问题……但无济于事。

    为了解决这个问题并将我们的应用程序的内存消耗保持在合理的水平,我们决定将我们的应用程序分成两种进程,一种用于主窗口,N 个子进程用于托管 WebBrowserControl。然后,设计一个管道协议(或类似 RMI/RPC)来将事件从主窗口传递到子进程,反之亦然。

    这样做,您可以使用浏览器进程池和后台 kill-and-spawn 策略设计回收策略,以将内存消耗控制在可控水平。

    【讨论】:

      【解决方案3】:

      您是否考虑过使用其他网络浏览器控件?那里有很多!我觉得chromium 是一个不错的选择,请查看this question 以了解替代方案。

      【讨论】:

        猜你喜欢
        • 2012-07-30
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-12
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 2013-01-27
        相关资源
        最近更新 更多