你的位置:首页 > ASP.net教程

[ASP.net教程]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方法