众所周知,WebBrowser
控件在某些情况下会增加其内存使用量而不释放它。极端情况是在谷歌即时启动时浏览谷歌中的页面。它每页增长约3 MB。即使我导航到about:blank
或我处置WebBrowser
,也不会释放此内存。
我知道任务管理器中的内存不可靠,并且有很多方法可以检查我的应用程序正在消耗的内存,但由于我真正关心的是阻止我的应用程序崩溃,我正在使用{{ 1}}类来计算我剩下多少内存。而作为我的previous result,我每页的使用量将减少约3 MB。
我做的最后一次测试是在我的应用程序中创建一个只有MemoryFailPoint
的表单,在Google上使用Google Instant执行搜索,然后每3秒自动导航到下一页。剩下的内存将减少,当接近100 MB时,我将关闭表单(将部署WebBrowser
)并看到内存保持不变。我还使用了SOS来确保WebBrowser
已正确处理。
WebBrowser
并且这些技巧不会释放内存。安装IE 8或IE 9也不会。我不想列出我尝试过的所有东西,因为它会让这个问题太长。我甚至联系过微软的付费支持也无济于事。
另一方面,关闭并重新启动应用程序将释放内存。所以我到目前为止最接近解决这个问题的方法是重新启动应用程序。
所以我的问题是,如何在不重新启动应用程序的情况下尽可能地重新启动应用程序?我正在考虑在单独的进程上运行GC.Collect()
并根据需要重新启动它。这个问题是我需要在另一个形式上使用它会弄乱我的应用程序的UI。
我想应该有办法告诉WebBrowser
“请离开我真的不想要你了!”通过卸载任何dll消耗所有这些内存然后重新加载它。我正在寻找极端措施。
请注意,此问题与我的previous one不同。我在这里需要知道的不是如何释放WebBrowser
使用的内存(因为这是不可能的,或者至少没有已知的解决方案),但是,一般来说,如果有办法运行“沙盒”中的控件然后清除此沙箱。非常类似于在单独的过程中运行它。
有什么想法吗?
答案 0 :(得分:1)
检查事件处理程序...如果在关闭表单之前没有删除它们,可以保留它们并禁止WebbRowser控件真正被处理......
您可以尝试以下几种方法:
GC.Collect ()
后Dispose()
之后调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1)