【问题标题】:Why did MVVMLight's RelayCommand use WeakAction为什么MVVMLight的RelayCommand使用WeakAction
【发布时间】:2018-06-26 18:29:24
【问题描述】:

我注意到GalaSoft.MvvmLight.CommandWpf.RelayCommand<T> 使用WeakAction<T>

这个设计考虑让我感到惊讶,我做了一些进一步的调查。
在浏览网页时,我遇到了this blog post,这加强了我的怀疑,但没有回答我原来的问题“为什么?”

为什么 GalaSoft 会故意使用 WeakAction 而不是普通的 Action 来允许函数收集垃圾?

谢谢。

【问题讨论】:

  • 为什么WeakAction<T> 存在?因为总是有开发人员认为弱侦听器(或类似结构)是个好主意。其中一些碰巧设计库......

标签: c# wpf mvvm garbage-collection mvvm-light


【解决方案1】:

为什么 GalaSoft 会故意使用 WeakAction 而不是普通的 Action 来允许函数收集垃圾?

很可能是为了防止命令使操作的所有者保持活动状态并导致MvvmLight 应用程序中的内存泄漏。

使用WeakAction<T>,所有者仍然有资格进行垃圾收集,尽管命令可能不是因为在命令和操作所有者之间没有强引用。

【讨论】:

  • 我了解机制的工作原理,但我不了解设计考虑因素。什么情况会导致泄漏?如果命令没有被引用,那么它的动作也会被收集...
  • 可能导致泄漏的情况是命令的生命周期超过操作所有者的生命周期。
【解决方案2】:

【讨论】:

  • 这说明什么是弱动作...我在问为什么它在那里使用...允许动作方法成为 GC。
  • @TomerW 是的。我的理解也是一样的;根据文档(mvvmlight.net)。
  • @dhilmathy 不,你的理解不一样。他在问为什么他们选择在RelayCommand 的实现中使用WeakAction,而不是WeakAction 所做的。另外,第一个链接失效了
猜你喜欢
  • 2014-06-25
  • 2022-01-06
  • 2014-04-12
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2011-12-13
  • 2023-03-18
相关资源
最近更新 更多