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