代码之家  ›  专栏  ›  技术社区  ›  Bubblewrap

实际需要/需要具有强引用的事件订阅的时间是什么时候?

  •  1
  • Bubblewrap  · 技术社区  · 16 年前

    我将从有关事件和强引用的问题的描述开始。复制自 here

    通常情况下,“主体”(带有事件的对象)的生存期比“观察者”(订阅事件的对象)长。当我们不再使用观察者时,我们希望它是垃圾收集的;但是,如果观察者仍然订阅了主题上的事件,则关联的事件处理程序持有对观察者的强引用,因此在主题也成为垃圾或观察者取消订阅之前,观察者不会被垃圾收集。

    遇到那个问题后,我去寻找解决办法。我读过 Weak Event Patterns 文章来自MSDN,并已多次使用该模式。感觉很胀。我去寻找更好的东西,看到了这两篇博文:

    这让事情变得容易多了。所以现在我有了一个简单的方法来使用弱事件订阅,我开始想,什么时候应该使用弱事件?结果我想不出原因 不 使用弱事件。

    我的问题是:你什么时候 希望 被试对听者有很强的参考力?在什么样的设计中,主题是唯一能让听者活着的东西,这是合乎逻辑的/可取的。如果侦听器完成了应用程序中的特定任务,是否总是有对它的“正常”引用?

    我是通过WPF彩色眼镜看这个的,对WPF相关的强引用的使用特别感兴趣。但非WPF相关的答案也会得到赞赏,如果只是知道这些用途的话。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Tim Cooper    15 年前
    public class MyForm : Form
    {
        public MyForm()
        {
            this.Closed += delegate
            {
                MessageBox.Show("If events were weak by default, you might never see this message.");
            };
        }
    }
    

    不过,如果弱事件模式是.NET更为内在的一部分,那就太好了。

        2
  •  0
  •   Tergiver    16 年前

    这不是这个问题的答案。只是想让你别再打这匹死马。

    为什么CLR不支持弱事件?

    A) 对它们没有足够的需求。我不相信这是真的。看看WPF为支持它们而添加的丑陋的膨胀。

    B) WPF包含丑陋的膨胀来支持弱事件。如果有人可以向CLR团队施加压力,让他们最终为弱事件提供CLR支持,你不认为WPF团队可以做到吗?

    因此:我们永远不会看到CLR对弱事件的支持。