【问题标题】:WPF Prevent memory leaks when our ViewModel is a static object当我们的 ViewModel 是静态对象时,WPF 防止内存泄漏
【发布时间】:2015-10-14 12:59:20
【问题描述】:

我现在在WPF 编码中有一些东西可能会导致Memory leaks。比如删除对象包含订阅了 long life 资源的事件处理程序。这方面我看过this article

现在,我的问题是:

如果我们的资源是 ViewModel 并且我们将其保存在 Static 对象中并将其提供给 Window DataContextDataContextUserControl 内的 UserControl,当我们想要到Close 我们的Window 我们应该所有 做以下工作来防止Memory leaks? :

  • ViewModel 事件手动取消订阅WindowUserControl 中的EventHandlers 全部
  • 解除绑定全部绑定Elements PropertiesViewModel手动
  • 解除绑定全部绑定CommandsViewModel手动

如果答案是肯定的,您建议以一种或多种方法自动完成这些工作的方法是什么,然后致电Window Closing

【问题讨论】:

    标签: c# wpf mvvm memory-leaks


    【解决方案1】:
    • 从 ViewModel 事件中手动取消订阅 Window 或 UserControl 的所有 EventHandler

    是的。如果窗口订阅了 VM 事件,则 VM 将持有对订阅者的引用。请注意,这不是 WPF 独有的,任何静态对象都会像这样保存事件引用。如果您不想手动取消订阅,则可以使用Weak Event Pattern。一般来说,我觉得退订更简单。

    • 手动解除绑定所有绑定到 ViewModel 的元素属性
    • 手动取消绑定所有绑定到 ViewModel 的命令

    不,通常您不需要担心绑定。唯一的情况是绑定对象不是 DependencyProperty 或实现 INotifyPropertyChanged 的​​对象。因为在 MVVM 中你通常绑定到 VM 属性,并且 VM 实现了 INPC,所以你很好。

    因此,始终在您的虚拟机中实现 INPC 是一种很好的做法,即使您从未启动过它。过去我有过泄漏,我没有为 INPC 烦恼,因为 VM 属性在构建后永远不会改变。

    唯一值得关注的是文章中给出的示例,例如 Count。但是,这些很少给我带来问题。如果您确实发现自己存在内存泄漏,那么您可以使用this answer 中列出的工具来找出罪魁祸首。

    【讨论】:

      猜你喜欢
      • 2011-12-05
      • 2015-02-05
      • 2017-04-15
      • 2012-06-23
      • 1970-01-01
      • 2010-09-21
      • 2013-11-01
      相关资源
      最近更新 更多