1

如果在这篇博文中找到 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 实现中的错误是什么吗?

4

2 回答 2

2

Jeffrey Richter,“通过 C# 进行 CLR”的作者实际上涵盖WeakEventHandlerWeakDelegate通过 C# 在 CLR 中实现。

在这里为您重复没有意义,但是您可以在此处查看他的修改代码:https ://www.wintellect.com/weak-event-handlers/

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

于 2012-10-14T06:08:10.073 回答
0

在第一次调用delegate之前做垃圾回收,你会发现代码并没有按预期工作,因为delegate对象被垃圾回收器提前回收了

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

另外你可以通过C# 3,第21节,第12节参考CLR中的例子,但是我的测试发现它仍然不能正常工作。我尝试如下修改代码,发现它按预期工作

    ..Code snippet.............
    public DotNotLiveJustForEvent()
    {
        ClickedHandler = new RoutedEventHandler(Clicked);
    }

    //Add a member variable that references the Clicked method
    public RoutedEventHandler ClickedHandler = null;
    public void Clicked(object sender, RoutedEventArgs e)
    {
        System.Windows.MessageBox.Show(DateTime.Now.ToShortDateString());
    }
    ...............
    ..Code snippet.............
        //The input parameter is changed to the variable
        btnTest.Click+= new WeakEventHandler(new DotNotLiveJustForEvent().ClickedHandler) {
            RemoveDelegateCode = eh =>
            {
               // btnTest.Click -= eh;
            }
        };
   ...............

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

于 2018-09-13T10:45:07.320 回答