CLR via C#深解筆記五,
事件處理實際上是一種具有特殊簽名的delegate, 像這個樣子:public delegate void EventHandler(object sender, EventArgs e);
類型定義事件成員,就可以通知其他對象發生了特定的事情。如果定義一個事件成員,意味著類型要提供一下能力:
#1,方法可登記也可注銷它對該事件的關注
#2,該事件發生時,登記了的方法會收到通知。
類型之所以能夠提供事件通知功能,是因為類型維護了一個已經登記方法的列表。事件發生後,類型將通知列表中所有已登記的方法。
CLR事件模型建立在委托的基礎上。委托是調用(invoke)回調方法的一種類型安全的方式。對象憑借回調方法接收他們訂閱的通知。
---------
invoke和call
在英語的語境中,invoke和call的區別在於,在執行一個所有信息都已知的方法時,用call比較恰當。這些信息包括要引用的類型、方法的簽名以及方法名。
但是,在需要先“喚出”某個東西來幫你調用一個信息不明的方法時,用invoke就比較恰當。
---------
這個OnBoiled方法的問題在於,線程可能發現Boiled不為null, 然後,就在調用之前,另一個線程從委托鏈中移除一個委托,使Boiled變成了null,還會拋出一個NullReferenceException異常。為了修正這個競態問題,可以像下面這樣寫OnBoiled方法