c# - 如何修复 IE WebBrowser 控件中的内存泄漏?

标签 c# winforms memory-leaks webbrowser-control

我正在尝试在 C# Winform 应用程序中嵌入 WebBrowser 控件。这听起来很容易。但是,我发现每次调用 Navigate 方法时,WebBrowser 控件都会占用大量内存。内存永远不会释放。内存使用量越来越大……

网上有很多人遇到了完全相同的问题,但我还没有找到满意的答案。这是迄今为止我发现的关于这个问题的最佳讨论:

Memory Leak in IE WebBrowser Control

有人建议升级到 IE8 来解决这个问题。

但是,无论用户是否安装了最新的 IE 版本,我都需要一个解决方案。我无法控制用户环境。

有人知道如何释放 WebBrowser 控件占用的内存吗?有解决方法吗? WebBrowser 控件是否有替代品?

更新: 我只是做了几个测试。在工作中,我正在运行 Windows XP 和 IE6。内存没有在那里增长。调用 navigate 方法时内存会增加,但会在一段时间后释放。在家里,我正在运行 Vista 并升级到 IE8。在这里我也看不到问题了。看起来这个问题是特定于 IE7 的。因此,问题应该改写为“安装 IE7 时如何修复 IE WebBrowser 控件中的内存泄漏”。谁能确认这个问题是 IE7 特有的?

最佳答案

我的应用程序在导航时也不断消耗内存,并且不再释放。 我在这里找到了解决方案: http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765-46e8-833d-6021ef79e0c8

为了完整起见,我贴出值得注意的摘录:

-- in class definition

    [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    internal static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

    [DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    internal static extern IntPtr GetCurrentProcess();

-- 减少内存时调用的代码

        IntPtr pHandle = GetCurrentProcess();
        SetProcessWorkingSetSize(pHandle, -1, -1);

所有荣誉: http://social.msdn.microsoft.com/profile/mike_t2e/?type=forum&referrer=http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/88c21427-e765-46e8-833d-6021ef79e0c8 用于发布解决方案。

http://ict-engineer.blogspot.com/2010/10/net-webbrowser-control-memory-leak.html 为了 SEO 正确,所以我可以找到它 ;)

问候

编辑:如果这可以帮助您快速解决问题 - 很好。但是你应该覆盖你的应用程序设计,你使用的模式(如果有的话),重构这个东西,如果你构建的时间更长......

关于c# - 如何修复 IE WebBrowser 控件中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/904478/

相关文章:

c# - 为什么要删除 String.Trim 制表符?

c# - ASP.NET MVC : Remove Empty fields in Details View

c# - 在 C# 中使用 TreeView 创 build 置表单

c# - 在 Windows 窗体中向 SplitContainer 添加面板

debugging - 什么是私有(private)字节、虚拟字节、工作集?

c# - 在 Windows 7 中使用备用数据流(分支)?

c# - 编写重试逻辑的最简洁方法?

c# - 如何通过将 dll 导入引用来在 C#.net for winforms 的工具箱中添加用户控件?

c# - 来自队列的大对象堆和字符串对象

C:内存泄漏实现一个简单的链表