17

WindowsBaseDLL 使用摘要定义事件IWeakEventListener

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

这种模糊的描述并没有描述“弱事件模式”实际上是什么。

那么,这种模式是什么,为什么要使用它,它在 WPF 应用程序之外有用吗?

编辑已经有一些很好的答案,但没有人谈论过这种模式在 WPF 应用程序之外是否有用。在我看来,弱事件模式(如依赖属性)与 WPF API 和 DLL 有着千丝万缕的联系。是否有可用于非 WPF 应用程序的等效实现?

4

3 回答 3

25

重要的一点在注释中:

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

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

于 2009-02-05T16:23:51.590 回答
11

弱事件模式

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

作为一个经验法则,如果事件发布者的等待时间比侦听器长,您可能会遇到这个问题并应该检查一下。

WeakEvents 应该可以帮助您,因为如果对它的唯一活动引用是“弱”,则该对象将被收集。仅当您计划开发新控件时才应该关注此模式,这通常会暴露大量事件。

基本思想类似于 WeakReference wrt 垃圾回收。

于 2009-02-05T16:27:23.797 回答
11

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

代替

source.Event += OnEvent;

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

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

在这里阅读更多。

于 2011-09-22T14:19:05.963 回答