c#事件实例二
事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。如果没有消息在等待,
则程序会把控制交回给操作系统,以运行其他程序。
操作系统只是简单地将消息传送给对象,由对象的事件驱动程序确定事件的处理方法。操作系统不必知道程序的内部工作机制,只是需要知道如何与对象进行对话,也就是如何传递消息。
先来看看事件编程有哪些好处。
1.使用事件,可以很方便地确定程序执行顺序。
2.当事件驱动程序等待事件时,它不占用很多资源。
3.事件简化了编程。
事件(event)
我们可以把事件编程简单地分成两个部分:事件发生的类(书面上叫事件发生器)和事件接收处理的类。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个个对象或方法将会加收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们需要有一个处理事件的方法。好了,我们就按照这个顺序来实现一个捕获键盘按键的程序,来一步一步说明如何编写事件应用程序。
namespace EventLearn001 { /* 因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,来保存按键信息,好让后面知道按了哪个键 * */ internal class KeyEventArgs : EventArgs { private char keyChar; //私有字段 public KeyEventArgs(char keyChar) : base() { this.keyChar = keyChar; } public char KeyChar //公开属性 { get { return keyChar; } } } //再创建一个事件发生的类keyInputMonitor,这个类用于监控键盘的输入并处罚一个事件; internal class KeyInputMonitor { //创建一个委托,返回类型为Void,两个参数 public delegate void KeyDownHandler(Object sender, KeyEventArgs e); //创建的委托和特定事件关联, 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]); switch (responseChar) { case 'x': finished = true; break; default: //得到按键信息的参数 KeyEventArgs args = new KeyEventArgs(responseChar); //出发事件 KeyDown(this,args); break; //KeyDown( this, KeyEventArgs );一句,这就是触发事件的语句,并将事件交由KeyDownHandler这个委托来处理, //委托指定事件处理方法去处理事件, //这就是事件接收方的类的事情了。 //参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息 } } while (!finished); } } //最后创建一个事件接收方的类,这个类先产生一个委托实例, //再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。然后提供一个方法回显按键信息。 internal class EventReceiver { public EventReceiver(KeyInputMonitor monitor) { monitor.KeyDown += onKeyDown; } private void onKeyDown(Object sender, KeyEventArgs e) { KeyInputMonitor obj = (KeyInputMonitor)sender;//可以将他强制转化成其他使用的内; Console.WriteLine("Capture key {0}",e.KeyChar); } } class Program { static void Main(string[] args) { //实例化一个事件发送器; KeyInputMonitor monitor = new KeyInputMonitor(); //实例化一个接受器 EventReceiver eventReceiver = new EventReceiver(monitor); monitor.Run(); } } }