这个WeakEventHandler的错误是什么?

时间:2012-10-14 05:51:20

标签: c# clr

如果在this blog post

中找到了WeakEventHandler

但他说:

更新:是的,我知道这已经破了。有一个错误意味着它不起作用......

并没有说出什么是错误:(

public class WeakEventHandler<DT, T> where T : EventArgs
{
    private WeakReference weakRefToOriginalDelegate;
    public WeakEventHandler(EventHandler<T> originalDelegate)
    {
        weakRefToOriginalDelegate = new WeakReference(originalDelegate);
    }

    private void DoInvoke(object sender, T args)
    {
        EventHandler<T> originalDelegate = (EventHandler<T>) weakRefToOriginalDelegate.Target;
        if (originalDelegate != null) originalDelegate(sender, args);
    }

    public static implicit operator DT(WeakEventHandler<DT, T> wd)
    {
        object o = Delegate.CreateDelegate(typeof (DT), wd, "DoInvoke");
        return (DT) o;
    }
}

有人可以解释这个WeakEventHandler实现中的错误是什么吗?

2 个答案:

答案 0 :(得分:2)

CLR via C#的作者Jeffrey Richter实际上通过C#涵盖了CLR中的WeakEventHandlerWeakDelegate实现。

这里没有必要为您重复,但您可以在此处查看修改后的代码:http://www.wintellect.com/cs/blogs/jeffreyr/archive/2011/03/17/weak-event-handlers.aspx

书中显示的代码并不像他预期的那样有效,所以上面的链接指向他的更正。

答案 1 :(得分:0)

在第一次调用委托之前进行垃圾收集,您会发现代码无法按预期工作,因为垃圾收集器会提前回收委托对象

kubectl exec -it POD_NAME /usr/bin/mongo

另外 您可以通过C#3,第21节,第12节引用CLR中的示例,但是我的测试发现它仍然无法正常工作。我试图按如下方式修改代码,发现它可以按预期工作

    ..Code snippet.............
    EventHandler h = new WeakEventHandler<EventHandler, EventArgs>(p.Handler);
    GC.Collect();
    h(null, EventArgs.Empty);
    p = null;
    ...............

注意:我不确定这是正确的,因为我不知道内部的工作原理,仅供参考