当我们的 ViewModel 是静态对象时,WPF 防止内存泄漏
WPF Prevent memory leaks when our ViewModel is a static object
我现在 WPF
编码中有些东西可能会导致 Memory leaks
。例如删除对象包含订阅 long life 资源的事件处理程序。在这方面,我已经阅读了this article。
现在,我的问题是:
如果我们的资源是 ViewModel
并且我们将其保存在 Static
对象中并将其提供给 Window
DataContext
或 DataContext
UserControl
在 Window
里面,当我们想要 Close
我们的 Window
时,我们应该做 所有 以下工作来防止 Memory leaks
? :
- 手动取消订阅
Window
或 UserControl
的 所有 EventHandlers
ViewModel
事件
- 取消绑定所有绑定
Elements Properties
到ViewModel
手动
- 取消绑定所有绑定
Commands
到ViewModel
手动
如果答案是肯定的,您建议使用一种或几种方法自动完成这些工作,然后在 Window Closing
上调用它们。
- 从 ViewModel 事件中手动取消订阅 Window 或 UserControl 的所有事件处理程序
是的。如果 window 订阅了 VM 事件,则 VM 将保存对订阅者的引用。请注意,这不是 WPF 独有的,任何静态对象都会像这样保存事件引用。如果你不想手动退订那么你可以使用Weak Event Pattern。一般来说,我觉得取消订阅更简单。
- 手动取消绑定所有元素属性到 ViewModel
- 手动取消绑定所有绑定到 ViewModel 的命令
不,通常您不需要担心绑定。唯一的情况是绑定对象不是 DependencyProperty 或实现 INotifyPropertyChanged 的东西。因为在 MVVM 中,您通常绑定到 VM 属性,而 VM 实现 INPC,所以您没问题。
因此,始终在您的 VM 中实施 INPC 是一种很好的做法,即使您从未启动过它也是如此。我过去有过泄漏,我没有为 INPC 烦恼,因为 VM 属性在构造后永远不会改变。
其他要看的只有文中给出的例子,比如Count。但是,这些很少给我带来问题。如果您确实发现自己存在内存泄漏,那么您可以使用 this answer 中概述的工具来找出罪魁祸首。
我现在 WPF
编码中有些东西可能会导致 Memory leaks
。例如删除对象包含订阅 long life 资源的事件处理程序。在这方面,我已经阅读了this article。
现在,我的问题是:
如果我们的资源是 ViewModel
并且我们将其保存在 Static
对象中并将其提供给 Window
DataContext
或 DataContext
UserControl
在 Window
里面,当我们想要 Close
我们的 Window
时,我们应该做 所有 以下工作来防止 Memory leaks
? :
- 手动取消订阅
Window
或UserControl
的 所有EventHandlers
ViewModel
事件 - 取消绑定所有绑定
Elements Properties
到ViewModel
手动 - 取消绑定所有绑定
Commands
到ViewModel
手动
如果答案是肯定的,您建议使用一种或几种方法自动完成这些工作,然后在 Window Closing
上调用它们。
- 从 ViewModel 事件中手动取消订阅 Window 或 UserControl 的所有事件处理程序
是的。如果 window 订阅了 VM 事件,则 VM 将保存对订阅者的引用。请注意,这不是 WPF 独有的,任何静态对象都会像这样保存事件引用。如果你不想手动退订那么你可以使用Weak Event Pattern。一般来说,我觉得取消订阅更简单。
- 手动取消绑定所有元素属性到 ViewModel
- 手动取消绑定所有绑定到 ViewModel 的命令
不,通常您不需要担心绑定。唯一的情况是绑定对象不是 DependencyProperty 或实现 INotifyPropertyChanged 的东西。因为在 MVVM 中,您通常绑定到 VM 属性,而 VM 实现 INPC,所以您没问题。
因此,始终在您的 VM 中实施 INPC 是一种很好的做法,即使您从未启动过它也是如此。我过去有过泄漏,我没有为 INPC 烦恼,因为 VM 属性在构造后永远不会改变。
其他要看的只有文中给出的例子,比如Count。但是,这些很少给我带来问题。如果您确实发现自己存在内存泄漏,那么您可以使用 this answer 中概述的工具来找出罪魁祸首。