在单独的线程或进程上运行控件,以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使用的内存(因为这是不可能的,或者至少没有已知的解决方案),但是,一般来说,如果有一种方法可以在"沙盒"中运行控件,然后清除这个沙盒。就像在一个单独的进程中运行一样。

任何想法?

在单独的线程或进程上运行控件,以100%控制其消耗的内存

检查事件处理程序…如果你在关闭窗体之前不删除它们,它们可能会保留并禁止WebbRowser控件真正被处理…

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

  • GC.Collect ()之后调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1),在Dispose()之后删除任何附加的事件处理程序
  • 使用比内置包装器更好的包装器,如
  • 使用完全不同的浏览器技术,如http://awesomium.com/