c# - WeakEventDelegate 实现 - 反馈请求

标签 c# .net delegates garbage-collection

我刚刚在 .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/

相关文章:

javascript - Knockout-3.2.0 - 内部列表 <object> 推送问题

c# - 在 ASP.NET Web api 中处理文件的良好做法?

c# - 防止在 DataGridView 控件中选择多个单元格

c# - 理解 Func<T, TResult> 使用 MVC 委托(delegate)

c# - 一对扑克牌的 GetHashCode C#

c# - 如果 c# 是类型安全语言,那么为什么允许使用 dynamic 和 object 关键字更改对象类型?

.net - 部署.NET 2.0 sp2

.net - 要求代码审查: does such XmlSerializer factory have any drawbacks?

ios - 带有委托(delegate)的 Storyboard模式 Segue

c# - 快速获取 Expression 方法调用目标的方法