问题 为什么在调用之前为事件分配处理程序?


基本上,我已经看到这经常使用:

    public event MyEventHandler MyEvent;

    private void SomeFunction()
    {
        MyEventHandler handler = this.MyEvent;

        if (handler != null)
        {
            handler(this, new MyEventArgs());
        }
    }

什么时候可以像这样容易地做到:

    public event MyEventHandler MyEvent;

    private void SomeFunction()
    {
        if (MyEvent != null)
        {
            MyEvent(this, new MyEventArgs());
        }
    }

那么,我错过了什么吗?是否有人将事件分配给处理程序,然后引发处理程序而不是事件本身?这只是“最佳实践”吗?


5397
2018-02-28 20:47


起源



答案:


对局部变量的赋值可确保在事件之间取消注册 if 而实际的调用,调用列表将不为null(因为变量将具有 复制 原始调用列表)。

这在多线程代码中很容易发生,在检查null和触发事件之间,它可能被另一个线程取消注册。

看到 这个 所以问答。


11
2018-02-28 20:50





线程安全。

如果在您检查MyEvent是否为空并且触发MyEvent之间发生了什么,另一个线程出现并取消订阅该事件?


2
2018-02-28 20:50