参考资料:.Net Framework 类库 http://msdn.microsoft.com/zh-cn/library/hh795167(v=vs.110)
也许你也正在读这本书:《C#高级编程》(第7版),也许读的时候你会对其中的弱事件模式有点疑惑,也许你正在一遍一遍地看书中给出的例子。
这篇文章并不能算是什么真正的技术文章,只是写给C#的初学者们看的,以帮助他们更好得理解弱事件模式。当然也许文中存在某些错误,欢迎在评论中指出,讲得不好,随便吐槽。
至于例子的源代码,书里面有,下载的配套源代码也有,如果真有需要,可以留言。
先说明示例中各个类文件的用途:
1. CarDealer.cs 这个文件包含了两个类,CarInfoEventArgs 是 EventArgs 的派生类,用来描述事件;CarDealer 定义了一个属性,一个方法,不难知道这个类是用来生成和保存事件的。这里必须弄清楚一点,就是委托 EventHandler 和 EventHandler<TEventArgs> 的实质。他们是委托,将事件和事件处理程序挂接起来,最重要的是执行之后会保存相应的事件数据。
2. Consumer.cs 类Consumer实现了接口 IWeakEventListener ,也就是说它是事件的监听方。该类中包含了 ReceiveWeakEvent 方法(既然要实行 IWeakEventListener 接口,自然要实现这个接口定义的唯一方法),在这个方法里,需要调用监听方编写的一个或几个方法,以在时间到达时,作出相应的处理。另外必须要说明一点, 在示例的其他地方并没有看到有明确写明调用它,那 ReceiveWeakEvent 方法究竟何时被调用呢?它是自动调用的,书中提到 DeliverEvent () 方法会在侦听器中调用它就是这个意思。
3. WeakCarInfoEventManager.cs 事件管理方。类 WeakCarInfoEventManager 派生自 WeakEventManager ,其中有 AddListener 和 RemoveListener ,意思很明显,就是添加和移除侦听器,它们并不是重写,因为 WeakEventManager 根本没有定义这两个方法,但有 ProtectedAddListener 和 ProtectedRemoveListener 方法,当然你可以在派生类中重写它们,但一般不会这么做,也不推荐,推荐的方式就是像例子里面那样,AddListener 和 RemoveListener 就是常用的方法名,并且定义成静态方法。由于执行了AddListener 和 RemoveListener ,就会相应地执行 StartListening 和 StopListening ,这个过程是自动的,不需要程序员在某个地方明确调用它们,这也意味着必须重写这两个方法,在方法中,必须为指定的 EventHandler (委托)封装方法。所封装的方法用来传递事件,因此它需要调用 DeliverEvent ,正如例子中的 CarDealer_NewCarInfo 。
好了,到这里基本讲清楚各文件的细节。
下面再次梳理一下整个程序的运行情况,看 Program.cs :
var dealer = new CarDealer(); //得到CarDealer实例dealer,至此尚无输出
var michael = new Consumer("Michael");//得到Consumer实例micheal,至此尚无输出
//dealer.NewCar("Mercedes");//不能写在这儿,但可以自行尝试看输出什么
WeakCarInfoEventManager.AddListener(dealer, michael);//添加侦听器,并开始侦听,至此无输出
dealer.NewCar("Mercedes");//触发事件并作出处理
执行 WeakCarInfoEventManager.AddListener(dealer, michael); 所引发的一连串动作:
1. AddListener 添加侦听器
2. 由AddListener 自动调用 StartListening 开始监听,在StartListening 中相应的 EventHandler 才真正有了封装方法
3. 调用StartListening 中所封装的方法传递事件,也即调用了 DeliverEvent
4. DeliverEvent 自动调用 Consumer 中的 ReceiveWeakEvent ,于是收到事件,执行相应的动作,即执行 NewCarIsHere
到这儿,你应该对整个Event 处理的过程有清晰的理解了吧。
Ok,祝后续的学习顺利。