新客立减

事件(

event

)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种

事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件。所谓事件就是

由某个对象发出的消息。

比如用户按下了某个按钮,

某个文件发生了改变,

socket

上有数据到达。触发事件的对象称作发送者(

sender

),捕获事件并且做出响应

的对象称作接收者(

receiver

),一个事件可以存在多个接受者。

 

在异步机制中,

事件是线程之间进行通信的一个非常常用的方式。

比如:

用户在

界面上按下一个按钮,

执行某项耗时的任务。

程序此时启动一个线程来处理这个

任务,

用户界面上显示一个进度条指示用户任务执行的状态。

这个功能就可以使

用事件来进行处理。

可以将处理任务的类作为消息的发送者,

任务开始时,

发出

TaskStart

”事件,任务进行中的不同时刻发出“

TaskDoing

”事件,并且携带

参数说明任务进行的比例,任务结束的时候发出“

TaskDone

”事件,在画面中

接收并且处理这些事件。

这样实现了功能,

并且界面和后台执行任务的模块耦合

程度也是最低的。

 

具体说

C#

语言,事件的实现依赖于“代理”(

delegate

)的概念,先了解一下代

理。

 

代理(

delegate

 

delegate

C#

中的一种类型,

它实际上是一个能够持有对某个方法的引用的类。

与其它的类不同,

delegate

类能够拥有一个签名(

signature

),并且它只能持

有与它的签名相匹配的方法的引用。

它所实现的功能与

C/C++

中的函数指针十分

相似。

它允许你传递一个类

A

的方法

m

给另一个类

B

的对象,

使得类

B

的对象能

够调用这个方法

m

但与函数指针相比,

delegate

有许多函数指针不具备的优点。

首先,函数指针只能指向静态函数,而

delegate

既可以引用静态函数,又可以

引用非静态成员函数。在引用非静态成员函数时,

delegate

不但保存了对此函

数入口指针的引用,

而且还保存了调用此函数的类实例的引用。

其次,

与函数指

针相比,

delegate

是面向对象、类型安全、可靠的受控(

managed

)对象。也就

是说,

runtime

能够保证

delegate

指向一个有效的方法,你无须担心

delegate

会指向无效地址或者越界地址。

 

实现一个

delegate

是很简单的,通过以下

3

个步骤即可实现一个

delegate

 

1.

  

声明一个

delegate

对象,

它应当与你想要传递的方法具有相同的参数和返

回值类型。

 

2.

  

创建

delegate

对象,并将你想要传递的函数作为参数传入。

 

3.

  

在要实现异步调用的地方,通过上一步创建的对象来调用方法。

 

下面是一个简单的例子:

 

public class

 MyDelegateTest 

 

 

 

 

// 

步骤

1

,声明

delegate

对象