.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: }
快速链接:http://www.antigamez.com/go/33407.html
Windows编程是好东西,HaHa
这两天把那个USBAutoCopy推掉重写了~
基本搞定了。。。
还差一个移除USB和一个禁止自动播放没做~
~
你写的看不懂耶~什么异步啊,线程啊,看到就晕···
那两个放代码的会滚的小窗口挺可爱的~