Jea*_*nal 5 .net c# delegates garbage-collection
我刚刚WeakEventDelegate在.NET中实现了一个类.
我在http://code.logos.com/blog/2008/08/event_subscription_using_weak_references.html和http://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数据绑定中,因此它将是使用推荐的弱事件基础结构的完美候选者).