但他说:
更新:是的,我知道这已经破了。有一个错误意味着它不起作用......
并没有说出什么是错误:(
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实现中的错误是什么吗?
答案 0 :(得分:2)
CLR via C#的作者Jeffrey Richter实际上通过C#涵盖了CLR中的WeakEventHandler
和WeakDelegate
实现。
这里没有必要为您重复,但您可以在此处查看修改后的代码: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;
...............
注意:我不确定这是正确的,因为我不知道内部的工作原理,仅供参考