WeakEventDelegate实现 - 反馈请求

Jea*_*nal 5 .net c# delegates garbage-collection

我刚刚WeakEventDelegate在.NET中实现了一个类.

我在http://code.logos.com/blog/2008/08/event_subscription_using_weak_references.htmlhttp://blogs.msdn.com/b/greg_schechter/archive/上看过其他文章以实现这样的效果.2004年/ 5月27日/ 143605.aspx

然而,我得到的实现不那么复杂(虽然不够灵活),似乎做了工作,所以我想知道是否有一些我错过了.

除了相对缺乏灵活性之外,以下实施是否有任何问题?

public class WeakEventDelegate<TEventArgs> 
    where TEventArgs : EventArgs
{
    private readonly WeakReference handlerReference;

    public WeakEventDelegate(Action<object, TEventArgs> handler)
    {
        handlerReference = new WeakReference(handler);
    }

    public void Handle(object source, TEventArgs e)
    {
        Action<object, TEventArgs> unwrappedHandler = (Action<object, TEventArgs>)handlerReference.Target;
        if (unwrappedHandler != null)
        {
            unwrappedHandler.Invoke(source, e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我写这个类的唯一目的是阻止从发布者到委托的隐式引用,以防止垃圾收集订阅者.

意思是,而不是写:

void subscribe()
{
    publisher.RaiseCustomEvent += this.HandleCustomEvent;
}
Run Code Online (Sandbox Code Playgroud)

我会写:

private readonly WeakDelegate<CustomEventArgs> _customHandler = new WeakDelegate<CustomEventArgs>(this.HandleCustomEvent);
void subscribe()
{
    publisher.RaiseCustomEvent += _customHandler.Handle;
}
Run Code Online (Sandbox Code Playgroud)

我想到的那个类的主要用例是针对一些具有我几乎无法控制的生命周期的集合类(订阅者).(但是其中一种情况发生在WPF数据绑定中,因此它将是使用推荐的弱事件基础结构的完美候选者).

Jea*_*nal 0

我发现该实现的一个关键问题 - 只有当我在其他地方保留对委托(在构造函数中传递的处理程序)的引用时它才有效。否则,该委托对象将被收集,并且该事件永远不会再次触发。