在单独的线程或进程上运行控件,以100%控制其消耗的内存
本文关键字:控制 100% 内存 控件 线程 单独 进程 运行 | 更新日期: 2023-09-27 18:11:26
众所周知,WebBrowser
控件在某些情况下会增加其内存使用而不释放它。一个极端的例子是在打开Google Instant的情况下浏览Google页面。它将以每页3 MB的速度增长。这个内存不会被释放,即使我导航到about:blank
或如果我处置WebBrowser
。
我知道任务管理器中的内存不可靠,并且有很多方法可以检查我的应用程序正在消耗的内存,但是因为我真正关心的是防止我的应用程序崩溃,所以我使用MemoryFailPoint
类来确定我还剩下多少内存。与之前的结果一样,每个页面的可用空间将减少3 MB。
我做的最后一个测试是在我的应用程序中创建一个表单,其中只有一个WebBrowser
,在Google中执行搜索与Google Instant打开,然后自动导航到下一页每3秒。剩余的内存将减少,当接近100 MB时,我将关闭表单(这将处理WebBrowser
),并看到剩余的内存保持不变。我还使用SOS来确保WebBrowser
已被妥善处理。
GC.Collect()
,这些技巧不会释放内存。安装ie8或ie9也不行。我不想列出我尝试过的所有事情,因为这会让这个问题变得太长。我甚至联系了微软的付费支持,但都无济于事。
另一方面,关闭和重新启动应用程序将释放内存。到目前为止,我最接近这个问题的明确解决方案是重新启动应用程序。
所以我的问题是,我怎样才能尽可能接近重新启动应用程序而不重新启动它?我正在考虑在一个单独的进程上运行WebBrowser
,并根据需要重新启动它。这样做的问题是,我需要把它放在另一个表单上,这会弄乱我的应用程序的UI。
我认为应该有一种方法告诉WebBrowser
"请走开,我真的不想要你了!"也许卸载任何dll正在消耗所有这些内存,然后重新加载它。我在寻找极端措施。
请注意,这个问题和我之前的问题不一样。我在这里需要知道的不是如何释放WebBrowser
使用的内存(因为这是不可能的,或者至少没有已知的解决方案),但是,一般来说,如果有一种方法可以在"沙盒"中运行控件,然后清除这个沙盒。就像在一个单独的进程中运行一样。
任何想法?
检查事件处理程序…如果你在关闭窗体之前不删除它们,它们可能会保留并禁止WebbRowser控件真正被处理…
你可以尝试以下几种方法:
- 在
GC.Collect ()
之后调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1)
,在Dispose()
之后删除任何附加的事件处理程序 - 使用比内置包装器更好的包装器,如
- 使用完全不同的浏览器技术,如http://awesomium.com/