gpt4 book ai didi

c# - WeakEventDelegate 实现 - 反馈请求

转载 作者:太空狗 更新时间:2023-10-29 23:34:09 24 4
gpt4 key购买 nike

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

我曾在 http://code.logos.com/blog/2008/08/event_subscription_using_weak_references.html 中看到其他文章实现了这样的事情和 http://blogs.msdn.com/b/greg_schechter/archive/2004/05/27/143605.aspx

但是,我得到的实现没有那么复杂(尽管不太灵活),而且似乎可以完成这项工作,所以我想知道我是否遗漏了什么。

除了相对缺乏灵 active 之外,下面的实现还有什么问题吗?

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);
}
}
}

编辑:我编写该类的唯一目的是防止从发布者到委托(delegate)的隐式引用,以防止订阅者的垃圾收集。

意思是,而不是写:

void subscribe()
{
publisher.RaiseCustomEvent += this.HandleCustomEvent;
}

我会写:

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

我想到的那个类的主要用例是一些集合类(订阅者),它们的生命周期我只能勉强控制。 (但是,其中一种情况发生在 WPF 数据绑定(bind)中,因此它非常适合使用推荐的弱事件基础结构)。

最佳答案

这里的主要问题是订阅您的委托(delegate) (handlerReference.Target) 的任何内容都会使 handlerReference 保持事件状态。

将其包装起来可以让您无需持有对它的引用即可调用您的委托(delegate),但不会阻止订户保持引用处于事件状态。

Weak Event Patterns框架功能通过中介支持。订阅是通过中介来处理的,等式的两边都是通过弱引用来维护的。没有任何东西直接持有对委托(delegate)的引用 - 因为对委托(delegate)的引用使对象保持事件状态。

关于c# - WeakEventDelegate 实现 - 反馈请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6574215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com