暴露对外的事件或者委托实例,如果没有订阅的方法,那么将为null
所以要这么写
采用事件而不是委托的好处是:如果采用委托实例,那么外界可以改变这个委托指向的方法。一句话就是破坏了封装性。而且严重的事情是,外界本来获得这个事件或者委托的实例是用来注册,但是一旦采用委托实例来做,那么没有办法阻止外界触发。。
用事件可以改变这个行为,在以前用委托的地方,在委托类型前面加个event修饰符,就可以了。
委托的GetInvocationList()方法可以获取每个注册的方法列表
如果我们要监控一个东西是不是发生了,一种就是不停的监控它的状态,当达到要求时,监控程序做事情。第二种就是,让被监控的对象告诉监控的程序,“我发生了”。事件就是这样一个东西,我们怎样通知监控的程序呢?被监控的对象提供一个板,每一个监控的东西打个钉子到这个板上。当发生了,我打下这个板,那么钉在上面的钉子都能感到震动。
这实际是一种异步操作。
现在如果这个板子上打了太多的钉子,然而有一些“钉子”执行的时间很长。那么后面钉子的执行只能等。那么我们最好采用异步的方式。下面是异步调用的框架。。凑合的看吧。。
解释一下代码:主方法基本上是注册事件和激活时间。最后一句是为了主线程不在begininvoke创建的线程执行完之前执行完。
采用BeginInvoke来调用,会创建一个新线程,立即返回,在新的线程里面执行。等执行完了,如何告诉我?和前面一样,我们不可能去监视,当然还是通过事件来完成,确实如此。当执行完了,会通过事件来告诉我们。C#定义了
begininvoke的第一个参数是这个类型的参数,调用结束了,将会调用这个方法来通知我们执行完了。第二个参数是传入的参数,隐藏在IAsyncResult的AsyncState中。