为什么在调用事件调用之前定义对事件的引用?

时间:2014-07-23 04:36:40

标签: c#

我找到了一些简单事件发送的例子。 我不理解第EventHandler<string> handler = MyEvent;

为什么他们需要定义对事件的引用而不只是使用myEvent进行调用?

代码

    public event EventHandler<string> MyEvent;  

    protected void SendEvent(string e)
    {
        EventHandler<string> handler = MyEvent;
        if (handler != null)
        {
            handler(this, e);
        }
    }

3 个答案:

答案 0 :(得分:3)

我找到了答案here

在多线程环境中,客户端可以在检查null之后取消订阅事件,但在实际调用之前,在这种情况下MyEvent将为null。

答案 1 :(得分:1)

if (MyEvent!= null)
{
     // If MyEvent is set to NULL (unsubscribed) in another thread 
     // between these two lines, the program crashes.
     MyEvent(this, e);
}

EventHandler<string> handler = MyEvent;
if (handler != null)
{
    // GC cannot connect MyEvent because there is additional reference to it - handler.
    // handler is local and cannot be set to NULL from another thread.
    // The code is thread safe.
    handler(this, e);
}

答案 2 :(得分:1)

原因是由于线程安全。在null检查和调用之间,可以从另一个线程中取消订阅事件处理程序,如果您没有进行该分配,则为您留下空值。