【问题标题】:Memory leak caused by WPF view containing a WebBrowser control包含 WebBrowser 控件的 WPF 视图导致的内存泄漏
【发布时间】:2019-11-26 17:55:43
【问题描述】:

我正在开发一个具有一个主容器的 MVVM (WPF) 应用程序。显示的视图取决于所选的菜单项(例如主页、产品信息等)。每当第一次访问视图时,内存消耗会随着关联的视图模型的实例化而略有增加;当进一步访问同一个视图时,由于使用了关联视图模型的现有实例,因此内存保持不变。

但是,一个包含WebBrowser 控件的视图在每次访问时都会无一例外地增加约80MB 的内存使用量;这个内存永远不会被释放——在 Home 和那个视图之间反复切换会导致应用程序耗尽内存并崩溃。使用内存分析器我发现这种增加发生在非托管代码中,尤其是user32.dll

浏览其他 StackOverflow 帖子时,我注意到 WebBrowser 和内存泄漏问题反复出现,但大多数帖子都指出这是 IE7 的问题。我们正在为我们的应用程序强制使用 IE11。我需要一些帮助来调查这个问题和潜在的解决方案。恐怕我无法发布代码,但任何提示都会有所帮助。

【问题讨论】:

  • Internet Explorer 通常存在很多问题。我建议不要将您的程序限制在 IE 上,而是将其分支出来以支持其他更好维护的浏览器。
  • @Symon 这实际上是未来版本的计划,切换到CefSharp。我只是想知道在那之前我们是否能找到一个修补程序。在我看来,对于这个功能,最好的解决方案是在浏览器中打开链接,但我不做这些决定。
  • 那么下一步将在您怀疑发生内存泄漏的地方放置一个断点(听起来您很清楚它在哪里)。然后,仔细检查以确保所有内容都按需要进行处理,并且需要删除的实例 正在 被删除。

标签: c# .net wpf memory-leaks unmanaged


【解决方案1】:

我发现了这个问题,它与WebBrowser 控件泄漏无关。代码(不是我写的)将WebBrowser 的实例从视图传递到视图模型,从而使视图模型包含对视图的硬引用。由于视图模型的生命周期对应于应用程序的生命周期,因此这些对视图的引用将永远保留。用正确的逻辑替换该逻辑可以解决问题。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2013-05-12
    • 2013-08-02
    • 2013-12-29
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多