关于自定义事件的问题

Mal*_*ist 5 .net c# events

我正在为C#制作自定义事件,有时它不起作用.

这就是我让事件发生的方式:

    private bool isDoorOpen;
    public bool IsDoorOpen {
        get { return isDoorOpen;}
        private set { isDoorOpen = value; DoorsChangeState(this, null);}
    }
Run Code Online (Sandbox Code Playgroud)

这些是事件声明:

    //events        
    public delegate void ChangedEventHandler(Elevator sender, EventArgs e);
    public event ChangedEventHandler PositionChanged;
    public event ChangedEventHandler DirectionChanged;
    public event ChangedEventHandler BreaksChangeState;
    public event ChangedEventHandler DoorsChangeState;
Run Code Online (Sandbox Code Playgroud)

只要有事件附加了方法,这就有效,但如果没有,则抛出空引用异常.我究竟做错了什么?

Cam*_*and 10

调用事件的推荐方法是

var handler = this.DoorsChangeState;
if (handler != null)
    handler(this, null);
Run Code Online (Sandbox Code Playgroud)

在本地复制处理程序的原因是当您检查null时,在另一个线程上更改事件处理程序.

编辑:发现文章谈论竞争条件. http://blogs.msdn.com/ericlippert/archive/2009/04/29/events-and-races.aspx