在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否发生,循环的检测某个变量是否发生变化但这样会占用大量的资源。而C# 的事件处理机制提供了一种非常好的解决方案。程序不再不停的检查设备,而是等待消息的到来,然后交给程序来处理他它。这样的话,操作系统中只是傻瓜式的将消息传递给对象,由对象的事件驱动程序确定该怎么做。
我们先来介绍一下什么是事件:
事件就是一种消息通知,它是对象之间传递消息的一种方式。事件是类的一种成员。使用Event声明事件。C#采用一种称作:“发布”-“登记”-“接受”的逻辑来在对象之间传 递消息,通知某个事件的发生。
接着,我们要来介绍一下什么是事件的委托,简单的说,委托就是一种面向对象的安全的函数指针。具体点:我们定义了两个类,一个用来发布事件,一个用来接收事件,但是发送方如何知道那个接收方将接受这个消息呢。这样的话,我们就需要在这两者之间创造一种媒介,这个媒介就是委托。
接着。我们来用代码的形式研究一下:
事件的发布者:
public class SomeSenderClass事件的接收者:
{
//事件声明
public event SomeEventHandler SomeEvent;
//通知事件登记对象
protected virtual void OnSomeEvent(SomeEventArgs e)
{
if (SomeEvent != null)
SomeEvent(this, e);
}
//模拟事件
public void SomeTiggerMethod()
{
//实例化事件参数
SomeEventArgs e = new SomeEventArgs();
//触发事件
OnSomeEvent(e);
}
}
public class SomeReceiverClass
{
public void SomeEventProcessMethod(
object sender, SomeEventArgs e)
{
Console.WriteLine("响应SomeEvent事件");
}
}
登记和触发事件代码的形式:
public class SomeApp {这样我们基本理解了C#事件处理的流程。
public static Main(string[] args) {
//实例化事件接受者
SomeReceiverClass myReceiver = new SomeReceiverClass();
//实例化事件发送者
SomeSenderClass mySender = new SomeSenderClass ();
//登记事件
mySender.SomeEvent += new
SomeEventHandler( myReceiver.SomeEventProcessMethod);
}
}
附上一个写的较好的处理按键事件处理的程序,来帮助我们理解C#事件处理。
using System;
internal class KeyEventArgs : EventArgs
{
private char keyChar;
public KeyEventArgs(char keyChar)
: base()
{
this.keyChar = keyChar;
}
public char KeyChar
{
get
{
return keyChar;
}
}
}
internal class KeyInputMonitor
{
// 创建一个委托,返回类型为void,两个参数
public delegate void KeyDownHandler(object sender, KeyEventArgs e);
// 将创建的委托和特定事件关联,在这里特定的事件为KeyDown
public event KeyDownHandler KeyDown;
public void Run()
{
bool finished = false;
do
{
Console.WriteLine("Input a char");
string response = Console.ReadLine();
char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);
// 得到按键信息的参数
KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
// 触发事件
KeyDown(this, keyEventArgs);
} while (!finished);
}
}
internal class EventReceiver
{
public EventReceiver(KeyInputMonitor monitor)
{
// 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
monitor.KeyDown += new KeyInputMonitor.KeyDownHandler(this.OnKeyDown);
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
// 真正的事件处理函数
Console.WriteLine("Capture key: {0}", e.KeyChar);
}
}
public class MainEntryPoint
{
public static void Main(string[] args)
{
// 实例化一个事件发送器
KeyInputMonitor monitor = new KeyInputMonitor();
// 实例化一个事件接收器
EventReceiver eventReceiver = new EventReceiver(monitor);
// 运行
monitor.Run();
}
}
参考自: http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html。