我正在尝试在 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://ict-engineer.blogspot.com/2010/10/net-webbrowser-control-memory-leak.html 为了 SEO 正确,所以我可以找到它 ;)
问候
编辑:如果这可以帮助您快速解决问题 - 很好。但是你应该覆盖你的应用程序设计,你使用的模式(如果有的话),重构这个东西,如果你构建的时间更长......
关于c# - 如何修复 IE WebBrowser 控件中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/904478/