c# - .NET Web 浏览器控件和 Dispose()

标签 c# .net session webbrowser-control dispose

我知道这是一个热门话题,有很多问题和答案,但我仍然没有找到以下问题的解决方案:

我有一个多选项卡应用程序。每个选项卡上都有一个 Webbrowser 控件。 由于网络浏览器为每个新选项卡占用更多内存,并且它们不会在选项卡关闭时释放此内存,因此我决定在选项卡关闭事件处理程序中创建一个 Webbrowser.Dispose() 。这帮助我解决了内存泄漏问题。关闭后所有使用的 RAM 现在都是免费的。

但这导致了一个新问题:在第一个 Dispose() 之后,所有其他 Webbrowser 对象的 session 似乎都被销毁了。 通常我只登录到第一个网络浏览器。如果我添加几个选项卡,我通常会自动登录。在第一个 Dispose() 之后,这不再起作用,我必须在每个新选项卡上登录。

我试图保留旧的 cookie 并使用新的网络浏览器再次发送它们,但这并没有解决问题。似乎被摧毁了。

最佳答案

这似乎是一个垃圾收集器问题。可以尝试使用System.GC.Collect()这种肮脏的方式,只是调用GarbageCollector来释放内存,但这不是解决问题的好方法。

根据您所说的,这似乎是一个指针问题。 如果您将 Connection 声明为全局变量,则必须先从选项卡分离连接,然后才能关闭/处置选项卡本身。 Me.Closing 事件应该可以帮助您这样做。 如果 Pointer 保持打开状态,作为对象的选项卡仍然连接在 Connection 上,并且将(不是很确定if/when)不会被 GC 清除。

如果你能阐明你复制/引用连接的方式,我可以给出更详细的答案。

编辑:经过一段时间的研究,我的担心变成了现实 - IE 下的缓存存在问题(据我所知 >5)。 http://social.msdn.microsoft.com/Forums/ie/en-US/88c21427-e765-46e8-833d-6021ef79e0c8/memory-leak-in-ie-webbrowser-control

建议是:

  • 手动调用 GarbageCollector

  • 限制 MemUsage(可能导致应用程序崩溃,也只是将页面写入磁盘)

  • about:blanc 覆盖缓存条目

  • 调用 C++ 方法覆盖缓存(WinINet - 我发现的所有内容都导致了一些 ProtectedMemory-Errors - 也许这 C# WebBrowser control: Clearing cache without clearing cookies 有效)

  • 使用 C++ 和 WinINet(我不知道任何真正的 .Net 实现,它也可能有内存泄漏)

  • 使用 IE 的替代品,例如 gecko (Mozilla) - https://bitbucket.org/geckofx/

关于c# - .NET Web 浏览器控件和 Dispose(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18055734/

相关文章:

C# 在提供的索引点内搜索数组

c# - 按对象的内部字段排序 List<T>

node.js - CORS 调用后 Express session cookie 不会保留

python - flask 在 cookie 中保存民意调查

asp.net - 如果我想维持 HTTP 和 HTTPS 之间的 session ,我该怎么办 - Asp.Net

c# - 从 LINQ 获取范围组结果

c# - 在 C# 方法中返回 bool 值

.net - 如何记录 WCF 消息内容?

c# - AssemblyVersion 和 AssemblyFileVersion 在一个单独的文件中

c# - 桌面应用程序的应用程序内购买