65.9K
CodeProject 正在变化。 阅读更多。
Home

创建弱事件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.47/5 (9投票s)

2009年4月8日

CPOL

1分钟阅读

viewsIcon

36413

downloadIcon

276

本文展示了如何使用 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 事件注册的对象。而且,我相信许多事件都可以使用它,因为很多时候我们需要在对象真正存活时收到通知。

© . All rights reserved.