當咱們定義一個事件的時候,默認會多出兩個方法,分別是添加,和刪除的方法spa
譬如code
public event EventHander myEvent //我定義了這麼一個事件 //那麼實際上IL中會多出2個方法,大概是下面這樣的 private event EventHander myEvent;// 原來的public 變爲private public void add_myEvent(EventHander value){ myEvent = (EventHander)Delegate.Combine(myEvent,value) } public void remove_myEvent(EventHander value){ myEvent = (EventHander)Delegate.Remove(myEvent,value) }
實際當咱們在其餘調用寫出myEvent+=……的時候,並無去真正訪問了myEvent,由於咱們看到實際的代碼已經對象
變成了私有的,實際上調用的是add_myEvent方法。blog
雖然CLR儘可能實現了同步,可是仍是有些問題的,這種狀況咱們能夠本身去實現add 與remove方法,本身控制鎖定事件
private event EventHander _myEvent;//本身定義一個私有的事件 private readonly object obj = new object();//定義個對象用來鎖定 Public EventHander myEvent { add{ lock(obj ){ _myEvent+=value; } } remove{ lock(obj){ _myEvent-=value; } } }