【问题标题】:How do weak events work?弱事件如何运作?
【发布时间】:2012-05-09 19:18:28
【问题描述】:

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

这是我的困境:

  1. 我了解当对象订阅事件时,事件源必须持有对订阅者的引用。
  2. 我也明白,如果订阅者超出范围或被显式销毁但事件源没有被销毁,那么订阅者将不会被垃圾回收,因为事件源仍然保留对订阅者的引用。
  3. 避免这种情况的常用方法是在对象被销毁之前显式取消订阅源的订阅。我知道,如果程序员无法确定何时会发生这种情况,这可能是个问题。

所以从上面我了解了事件的使用如何导致内存泄漏以及为什么需要弱引用模式,但阻止我理解的是弱事件模式实际上是如何实现这个目标的?它有什么不同?

当然,即使有一个管理事件的类,它仍然必须订阅和取消订阅处理程序到/从源,因此引用必须存在,这与使用事件的标准方式产生相同的问题。

请有人向我解释我遗漏或误解了什么基本概念,并帮助我“了解”弱事件模式。

【问题讨论】:

    标签: c# wpf weak-events


    【解决方案1】:

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

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

    在幕后,WeakEventManager 持有对事件订阅者的弱引用。如果订阅者恰好在事件引发之前被 GC,WeakEventManager 只是耸耸肩说“好吧,那家伙死了,从现在开始我将停止尝试通知他这个事件”

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2015-04-08
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多