在分离的线程或进程上运行控件,以100%控制它消耗的内存

时间:2011-10-16 00:31:47

标签: c# winforms webbrowser-control

众所周知,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使用的内存(因为这是不可能的,或者至少没有已知的解决方案),但是,一般来说,如果有办法运行“沙盒”中的控件然后清除此沙箱。非常类似于在单独的过程中运行它。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

检查事件处理程序...如果在关闭表单之前没有删除它们,可以保留它们并禁止WebbRowser控件真正被处理......

您可以尝试以下几种方法: