我知道这是一个热门话题,有很多问题和答案,但我仍然没有找到以下问题的解决方案:
我有一个多选项卡应用程序。每个选项卡上都有一个 Webbrowser 控件。
由于网络浏览器为每个新选项卡占用更多内存,并且它们不会在选项卡关闭时释放此内存,因此我决定在选项卡关闭事件处理程序中创建一个 Webbrowser.Dispose() 。这帮助我解决了内存泄漏问题。关闭后,所有使用的 RAM 现在都是空闲的。
但这导致了一个新问题:在第一个 Dispose() 之后,似乎所有其他 Webbrowser 对象的会话都被销毁了。
通常我只登录第一个网络浏览器。如果我添加几个选项卡,我通常会自动登录。在第一个 Dispose() 之后,这不再起作用,我必须在每个新选项卡上登录。
我尝试保留旧的 cookie 并使用新的网络浏览器再次发送它们,但这并没有解决问题。看来是被毁了。
这似乎是一个垃圾收集器问题。你可以尝试使用肮脏的方式System.GC.Collect(),只是调用垃圾收集器来释放内存,但这并不是解决问题的好方法。
根据你所说,这似乎是一个指针问题。
如果将 Connection 声明为全局变量,则必须先将连接与选项卡分离,然后才能关闭/处置选项卡本身。事件我.结束语应该可以帮助你做到这一点。
如果指针保持打开状态,则选项卡作为对象仍然连接在连接上,并且将(不太确定)if/when)没有被 GC 清理。
如果您可以澄清复制/引用连接的方式,我可以给出更详细的答案。
EDIT:经过一段时间的研究,我的担忧变成了现实 - IE 下的缓存存在问题(据我所知> 5)。http://social.msdn.microsoft.com/Forums/ie/en-US/88c21427-e765-46e8-833d-6021ef79e0c8/memory-leak-in-ie-webbrowser-control
建议是:
手动调用垃圾收集器
限制 MemUsage(可能导致应用程序崩溃,并且仅将页面写入磁盘)
about:blanc 覆盖缓存条目
调用 C++ 方法来覆盖缓存(WinINet - 我发现的所有结果都导致了一些 ProtectedMemory-Errors - 也许是这个C# WebBrowser控件:清除缓存而不清除cookie works)
使用 C++ 和 WinINet (我不知道任何真正的 .Net 实现,它也可能存在内存泄漏)
使用 IE 的替代品,例如 gecko (Mozilla) -https://bitbucket.org/geckofx/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)