创建弱事件






3.47/5 (9投票s)
本文展示了如何使用 WeakDelegateSet
类来创建弱事件。使用弱事件,对象可以注册到事件中,但如果它们唯一的引用就是这些事件,则允许被垃圾回收。
引言
本文简单地展示了,借助 WeakDelegateSet
类,创建弱事件(允许响应它的对象被回收)非常简单。
背景
我在另一篇文章中发现了一个愚蠢的错误(但可能演变成一个严重的问题)时,创建了这个类。注册到 GCUtils.Collected
事件中的类,如果它们没有从事件中取消注册,则不允许被回收。这必须是一个弱事件,所以我做了这个,并创建了一个帮助这个过程的类。
使用代码
要创建弱事件,您必须创建一个 WeakDelegateSet
,并且必须将事件的添加和移除处理程序重定向到该 WeakDelegateSet
。例如
private WeakDelegateSet fMyWeakEvent = new WeakDelegateSet();
public event EventHandler MyWeakEvent
{
add
{
fMyWeakEvent.Add(value);
}
remove
{
fMyWeakEvent.Remove(value);
}
}
然后,您使用 WeakDelegateSet
中的 Invoke
方法来调用事件,并将所有必需的参数传递给它。所以,对于我的示例事件
fMyWeakEvent.Invoke(this, EventArgs.Empty);
这就是创建弱事件所需的一切。也许这不是一个非常常见的需求,但我需要弱事件来能够在未调用 Dispose
的情况下,回收为 Collected
事件注册的对象。而且,我相信许多事件都可以使用它,因为很多时候我们需要在对象真正存活时收到通知。