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

Dre*_*kes 16 .net wpf events design-patterns weak-events

WindowsBaseDLL定义IWeakEventListener与摘要事件:

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

这个模糊的描述没有描述'WeakEvent模式'实际上是什么.

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

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

Jon*_*eet 24

重要的一点是在评论中:

遵循WeakEvent模式的主要原因是事件源具有可能独立于事件侦听器的对象生存期.使用WeakEventManager的中央事件调度允许侦听器的处理程序被垃圾收集,即使源对象仍然存在

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

  • @zvolkov:因为突然订户需要知道*什么时候它想要有资格进行垃圾收集,这通常会导致系统周围传播额外的知识,突然间你失去了*automatic*垃圾的一半好处采集. (7认同)

Gis*_*shu 11

WeakEvent模式

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

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

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

基本思路类似于WeakReference和垃圾收集.


Jow*_*wen 8

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

代替

source.Event += OnEvent;
Run Code Online (Sandbox Code Playgroud)

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

WeakEventManager<EventSource, EventArgs>.AddHandler(source, "Event", OnEvent);
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多.