一.事件的含义
事件类似于异常,因为它们都由对象引发(抛出),我们可以提供代码来处理事件。但它们也有几个重要的区别。最重要的区别是并没有与try ... catch 类似的结构来处理事件,而必须订阅(subscribe)它们。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,它们称为事件处理程序。
基本处理过程如下所示:
(1)应用程序创建一个可以引发事件的对象。例如,假定一个即时消息传送(instant messaging)应用程序创建的对象表示一个远程用户的连接。当接收到通过该连接从远程用户传送来的信息时,这个连接对象会引发一个事件。
(2)应用程序订阅事件。为此,即时消息传送应用程序将定义一个方法,该方法可以与事件指定的委托类型一起使用,把这个方法的一个引用传送给事件,而事件的处理方法可以是另一个对象的方法,假定是表示显示设备的对象,当接收到信息时,该方法将显示即时消息。
(3)引发事件后,就通知订阅器。当接收到通过连接对象传来的即时消息时,就调用显示设备对象上的事件处理方法。因为我们使用的是一个标准方法,所以引发事件的对象可以通过参数传送任何相关的信息,这样就大大增加了事件的通用性。
二.快速入门
Timer.Elapsed 事件的委托包含了事件处理程序中常见的两类参数,如下所示:
object source——引发事件的对象的引用
ElapsedEventArgs e——由事件传送的参数
static int counter = 0;
static string displayString ="This string will appear one letter at a time. ";
static void Main(string[] args)
{
Timer myTimer = new Timer(100); //定义定时器
myTimer.Elapsed += WriteChar; //Elapsed触发事件WriteChar
myTimer.Start(); //开启定时器
Console.ReadKey();
}
/// <summary>
/// 自定义事件
/// </summary>
/// <param name="source"></param>
/// <param name="e"></param>ElapsedEventArgs只用在Timer.Elapsed事件处理函数中,为事件处理提供数据。
static void WriteChar(object source, ElapsedEventArgs e)
{
Console.Write(displayString[counter++ % displayString.Length]);///输出字符串
}
3.简单事件处理程序
第一步:定义事件处理程序
private void CheckForMessage(object source, ElapsedEventArgs e)
{Console.WriteLine("Checking for new messages.");
if ((random.Next(9) == 0) && (MessageArrived != null)) ///生成随机数0,并且事件不为空
{
MessageArrived("Hello Mum!");
}
}
第二步:注册事件的处理程序
private Timer pollTimer;
public Connection()///构造函数
{
pollTimer = new Timer(100);
pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage); ///注册Elapsed事件的一个事件处理程序
///该事件是按定时器到时间来触发的,即开启计时后,每100ms就会触发一次。
}
第三步:启动事件触发程序
myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage) ;