.NET 事件模型

本文处于未完成状态

 

“事件”是贯穿 .NET 甚至整个 Windows 编程的一个核心概念。“事件驱动”,“事件模型”,“异步模式”都与事件密不可分。可惜的是,事件模型很难被初学者理解和掌握。到现在为止,我也不清楚自己是否真正的从“事件”谜团中饶了出来。总之,想一点,懂一点,写一点吧。随时修改修正

 

MSDN中对事件的特点做了如下几点描述:

发行者确定何时引发事件,订户确定执行何种操作来响应该事件。
一个事件可以有多个订户。一个订户可处理来自多个发行者的多个事件。
没有订户的事件永远也不会引发。
事件通常用于通知用户操作,例如,图形用户界面中的按钮单击或菜单选择操作。
如果一个事件有多个订户,当引发该事件时,会同步调用多个事件处理程序。要异步调用事件,请参见使用异步方式调用同步方法。
可以利用事件同步线程。
在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。

透过MSDN一贯晦涩的行文措辞,可以做如下的几点理解:

1、存在于事件模型中的实体(对象):发行者,订户(OK,很难听,还是用 Publisher 和 Subscriber 吧)。

2、存在于事件模型中的操作:事件的声明,事件的订阅,事件的触发,事件的响应,事件的取消。

3、事件的用途:通知用户、线程同步。

4、事件的设计在 .NET 中有相应的规范需遵守。

5、事件的一些其他特性。

OK,现在来实现事件模型。

 

我需要一个 Publisher 和一个 Subscriber,按照惯性思维,我知道这样需要创建两个类:Publisher,Subscriber。

 

接下来做一个翻译:MSDN 说 Publisher 决定何时引发事件,意味着 Publisher 类应该是事件的所有者(Publisher Pub 的就是 Event 嘛);Subscriber 响应事件,所谓“响应”,无非是说,在 Subscriber 类中,我们应该有这么一种手段,可以在事件触发时,做一些动作。别的难理解,“动作”这个词还是知道的——一个方法嘛,所以 Subscriber 类里应该有一个用于事件响应的方法。

 

于是得到这样的一段代码:

   1: class Publisher {
   2:     // 事件的声明
   3:     public event EventHandler MyEvent;
   4: }
   5:  
   6: class Subscriber {
   7:     public void React() {
   8:         // 响应
   9:     }
  10: }

如此,在 Publisher 类中声明了一个 EventHandler 委托类型的事件 MyEvent,EventHandler 是.NET Framework 的自有类型。声明事件不一定非要用这个类型,但是,微软建议咱们跟着规范走,那么就跟着先把。在类 Subscriber 中,有 React 方法,作为事件的响应,现在它还是个摆设——因为现在事件既无法触发,Publisher 和 Subscriber 之间也无法建立起任何的联系。

 

接下来就是那些不那么直观的代码了:

   1: class Publisher {
   2:     // 事件的声明
   3:     public event EventHandler MyEvent;
   4:  
   5:     // 调用DoSomething方法时引发事件
   6:     public void DoSomething() {
   7:         OnMyEventRaise();
   8:     }
   9:  
  10:     // 包装事件
  11:     public virtual void OnMyEventRaise() {
  12:         EventHandler handler = MyEvent;
  13:  
  14:         if ( handler != null ) {
  15:             handler( this, new EventArgs() );
  16:         }
  17:     }
  18: }
  19:  
  20: class Subscriber {
  21:     // 事件处理函数
  22:     public void React(object sender, EventArgs e) {
  23:         Console.WriteLine( "Subscribed!" );
  24:     }
  25:  
  26:     // 订阅事件,将事件与处理函数挂接
  27:     public void Subscribe( Publisher publisher ) {
  28:         publisher.MyEvent += React;
  29:     }
  30: }

随机文章:

相关日志

Comments (1)

贼寇在何方10月 3rd, 2008 at 12:35 am

Windows编程是好东西,HaHa
这两天把那个USBAutoCopy推掉重写了~
基本搞定了。。。
还差一个移除USB和一个禁止自动播放没做~
~
你写的看不懂耶~什么异步啊,线程啊,看到就晕···
那两个放代码的会滚的小窗口挺可爱的~

Leave a comment

Your comment