Windows中的原理如下,其中有三个部分:第一部分,事件源即事件的发生地就是触发事件的控件;第二部分,订阅器即事件的处理程序,用函数实现;第三部分,事件源和事件处理程序间的通信即消息。其中订阅就是编写响应代码,订阅器就是事件处理程序方法。下面程序实现当发生键盘输入事件后,有系统作出响应在屏幕上输出:“message arrived: ”加上输入的字符串。
using System;
using System.Timers;
using System.Collections.Generic;
using System.Windows.Forms;
//事件源,触发事件的地方
namespace Test
{
public delegate void MessageHandle(string msg);
public class Connection
{
public event MessageHandle MsgArrived;
public void Connect()
{
string str;
while (true)
{
str = Console.ReadLine();
if (str.Equals("END")) break;
MsgArrived(str);
}
}
}
}
//事件的处理程序
namespace Test
{
public class Display
{
public void DisplayMsg(string msg)
{
System.Console.WriteLine("Message arrived : {0}",msg);
}
}
}
//测试代码
namespace Test
{
static class Test
{
static void Main()
{
Connection myconn = new Connection();
Display mydis = new Display();
myconn.MsgArrived += new MessageHandle(mydis.DisplayMsg);
myconn.Connect();
System.Console.ReadKey();
}
}
}
这个程序中消息很简单就是string字符串,首先我们先来看事件源部分,这儿我们先定义了一个公有的委托类型,指定了事件处理方法必须遵循的方法的签名,接着定义了一个用于触发事件的Connection类,这个类很简单,只有一个公有的事件和一个connect方法,其中共有的事件MessageHandle就是这个类将要触发的事件,connect方法的功能是死循环一直要求从键盘输入,然后对键盘输入的内容进行判断,当输入的字符串是“END”是结束循环,否则触发事件msgArrived其中消息就是从键盘上得到的字符串。
第二部分,就是事件的处理程序,这部分就是我们在Windows编程中经常要自己编写代码的地方,在这儿定义一个用于显示的Display类,这个类更简单只有一个displayMsg方法注意此方法和前面我们定义的委托类型的签名一致,这个方法就是把我们的到信息简单的在前面加上“Message arrived :”就表示已经处理过了,输出到屏幕上。
最后我们看一下,测试代码,首先实例化了connection和display的实例化对象,接着是很重要的一步,用new实例化一个委托类型MessageHandle的对象,然后把这个对象注册到connection的对象myconn的事件属性MsgArrived上,这样当myconn对象触发了事件后就会自动地执行此事件,即调用委托的代码;而MsgArrived属性是委托类型的实例他必须要和一个方法相联系,在实例化是就是用mydis.DisplayMsg来初始化他的,也就是当调用委托代码,其实调用的是display类的displaymsg方法。
到此,事件也就全部实现了。