WPF当我们的ViewModel是静态对象时,防止内存泄漏

时间:2015-07-24 01:15:19

标签: c# wpf mvvm memory-leaks

我现在WPF编码中有一些内容可能导致Memory leaks。比如删除对象包含在长寿命资源中订阅的事件处理程序。在这方面,我已阅读this article

现在,我的问题是:

如果我们的资源是ViewModel,我们会将其保存在Static对象中并将其提供给Window DataContextDataContextUserControl 1}}在Window内,当我们想要Close我们的Window时,我们应该所有以下作品来阻止Memory leaks吗? :

  • 取消订阅EventHandlers的所有 WindowUserControl活动中的ViewModel
  • 所有绑定Elements Properties解除绑定到ViewModel manualy
  • 所有绑定Commands解除绑定到ViewModel manualy

如果答案是肯定的,那么您在一种或多种方法中自动完成这些工作的建议方式是什么,然后在Window Closing上调用它们。

1 个答案:

答案 0 :(得分:2)

  • 手动取消订阅ViewModel事件中Window或UserControl的所有EventHandler

是。如果窗口订阅了VM事件,则VM将保留对订户的引用。请注意,这不是WPF独有的,任何静态对象都将保存这样的事件引用。如果您不想手动取消订阅,则可以使用Weak Event Pattern。一般来说,我发现只需取消订阅即可。

  • 将所有绑定的元素属性解除绑定到ViewModel手动
  • 将所有绑定的命令解压缩到ViewModel手动

不,通常您不必担心绑定。唯一的情况是绑定对象不是DependencyProperty或实现INotifyPropertyChanged的东西。因为在MVVM中,您通常绑定到VM属性,而VM实现INPC就可以了。

出于这个原因,最好始终在您的VM中实施INPC,即使您从未触发它。我过去曾经遇到过泄漏问题,因为VM属性在构建之后永远不会改变。

唯一需要注意的是文章中给出的例子,例如Count。但是,这些很少给我带来麻烦。如果您确实发现内存泄漏,那么您可以使用this answer中列出的工具来查找罪魁祸首。