弱事如何运作?

时间:2012-05-09 19:18:29

标签: c# wpf weak-events

我目前正在学习WPF并且偶然发现了弱事件的概念,但我真的很难“搞定”。我已经在Stackoverflow上阅读了无数文章并查看了代码示例,但它并没有陷入其中。

这是我的困境:

  1. 据我所知,当一个对象订阅一个事件时,该事件的来源必须保持对该订阅者的引用。
  2. 我也明白,如果订阅者超出范围或被明确销毁但事件源未被销毁,则订阅者将不会被垃圾收集,因为事件源仍保留对订阅者的引用。
  3. 避免这种情况的常用方法是在销毁对象之前明确地从源中取消订阅。我知道如果程序员无法确定何时会发生这种情况,这可能是一个问题。
  4. 因此,从上面我了解事件的使用如何导致内存泄漏以及为什么需要弱参考模式但是阻止我理解的是弱事件模式如何实际实现这一目标?它有什么不同的做法?

    当然,即使有一个管理事件的类,它仍然需要订阅和取消订阅源处理器的处理程序,因此引用必须存在,给出了使用事件的标准方法的相同问题。

    有人请向我解释一下我遗漏或误解的基本概念,并帮助我“搞”弱事件模式。

1 个答案:

答案 0 :(得分:18)

你缺少的是弱事件(使用Weak References的封面,而后者使用GCHandle)正在利用内置的CLR行为来处理需要访问的特定情况对象没有强烈的引用 - 也就是说,它们不受应用程序代码所遵循的正常“规则”的约束。

请参阅http://sankarsan.wordpress.com/2008/08/09/weak-references/

在幕后,WeakEventManager持有对事件订阅者的弱引用。如果订阅者在事件发生之前恰好是GC'd,那么WeakEventManager只是耸了耸肩并且说“好吧,那家伙已经死了,我只是打算从现在开始尝试通知他这个事件”