WindowsBase
DLL使用摘要定义IWeakEventListener
事件:
为期望通过WeakEvent模式和System.Windows.WeakEventManager接收事件的类提供事件侦听支持。
这个模糊的描述没有描述'WeakEvent模式'究竟是什么。
那么,这个模式是什么,为什么使用它并且在WPF应用程序之外它是否有用?
编辑已经有一些好的答案,但没有人谈到这种模式在WPF应用程序之外是否有用。在我看来,弱事件模式,如依赖属性,与WPF API和DLL密不可分。是否有适用于非WPF应用程序的等效实现?
答案 0 :(得分:24)
重要的一点是备注:
遵循的主要原因 WeakEvent模式是事件的时候 source的对象生命周期是 可能与事件无关 听众。使用中心事件 调度WeakEventManager 允许监听器的处理程序 垃圾收集即使来源 对象持续存在
因此,如果您有publisher
和subscriber
个对象,那么通常在subscriber
订阅publisher
的事件后,subscriber
不能是垃圾集。弱事件模式使两个“弱”之间的链接(如在WeakReference中),以便没有这种依赖。 (另一种方法是在subscriber
想要有资格进行垃圾收集时取消订阅该事件,但这会变得混乱。)
答案 1 :(得分:11)
订阅事件可能导致订阅者无法收集。您假设该对象将被收集,因为您没有对其进行任何其他引用 - 但事件发布者保留在侦听器对象上并将其保留在内存中(除非它明确取消订阅,在这种情况下您需要确切地知道何时退订)。管理泄漏。
作为一个拇指规则,如果事件发布者要比听众停留的时间更长,你可以遇到这个问题并且应该检查一下。
WeakEvents应该在这里帮助你,因为如果对象的唯一有效引用是'Weak',则会收集该对象。只有在计划开发新控件时才应该关注此模式,这些控件通常会暴露大量事件。
基本思想类似于WeakReference w.r.t.垃圾收集。
答案 2 :(得分:7)
在.NET 4.5中,改进了对建立事件弱引用的支持。
而不是
source.Event += OnEvent;
您可以使用新的WeakEventManager<TEventSource, TEventArgs>:
WeakEventManager<EventSource, EventArgs>.AddHandler(source, "Event", OnEvent);