什么是WPF应用程序中使用的“弱事件”模式?

时间:2009-02-05 16:20:32

标签: .net wpf events design-patterns weak-events

WindowsBase DLL使用摘要定义IWeakEventListener事件:

  

为期望通过WeakEvent模式和System.Windows.WeakEventManager接收事件的类提供事件侦听支持。

这个模糊的描述没有描述'WeakEvent模式'究竟是什么。

那么,这个模式是什么,为什么使用它并且在WPF应用程序之外它是否有用?

编辑已经有一些好的答案,但没有人谈到这种模式在WPF应用程序之外是否有用。在我看来,弱事件模式,如依赖属性,与WPF API和DLL密不可分。是否有适用于非WPF应用程序的等效实现?

3 个答案:

答案 0 :(得分:24)

重要的一点是备注:

  

遵循的主要原因   WeakEvent模式是事件的时候   source的对象生命周期是   可能与事件无关   听众。使用中心事件   调度WeakEventManager   允许监听器的处理程序   垃圾收集即使来源   对象持续存在

因此,如果您有publishersubscriber个对象,那么通常在subscriber订阅publisher的事件后,subscriber不能是垃圾集。弱事件模式使两个“弱”之间的链接(如在WeakReference中),以便没有这种依赖。 (另一种方法是在subscriber想要有资格进行垃圾收集时取消订阅该事件,但这会变得混乱。)

答案 1 :(得分:11)

WeakEvent Patterns

订阅事件可能导致订阅者无法收集。您假设该对象将被收集,因为您没有对其进行任何其他引用 - 但事件发布者保留在侦听器对象上并将其保留在内存中(除非它明确取消订阅,在这种情况下您需要确切地知道何时退订)。管理泄漏。

作为一个拇指规则,如果事件发布者要比听众停留的时间更长,你可以遇到这个问题并且应该检查一下。

WeakEvents应该在这里帮助你,因为如果对象的唯一有效引用是'Weak',则会收集该对象。只有在计划开发新控件时才应该关注此模式,这些控件通常会暴露大量事件。

基本思想类似于WeakReference w.r.t.垃圾收集。

答案 2 :(得分:7)

在.NET 4.5中,改进了对建立事件弱引用的支持。

而不是

source.Event += OnEvent;

您可以使用新的WeakEventManager<TEventSource, TEventArgs>

WeakEventManager<EventSource, EventArgs>.AddHandler(source, "Event", OnEvent);

Read more here.