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方法
 
相關文章
相關標籤/搜索