最近在做的项目是用C#.NET进行开发,需要大量的用到C#中的委托和事件机制,而我以前一直都是在用C++编程,所以最近好好学习了一下C#的委托和事件,下面将结合我在项目开发中的一小段代码来进行记录,算是对这部分内容的一个总结。
下面先简单介绍一下C#中的委托和事件(其中大部分内容都来自《C#高级编程 第四版》)
最近在做的项目是Windows Mobile手机SmarPhone系统上的PoC客户端。我负责UI部分,用C#开发,实现时再调用底层C++开发的各个模块接口。由于是并行开发,我无法等待其他模块开发完成,只能先自己利用模拟调用的函数来生成各个相应事件来模拟整个PoC流程。
有三个类,分别是FrmLogin(登陆窗口)、 PInvoke(存放模拟调用的各个函数) 、Global(存放一些基本参数)。FrmLogin调用PInvoke的Register函数,Register函数生成PoCEvent事件返回给FrmLogin,FrmLogin取得PoCEventArgs中的一个参数。整个过程十分简单。
首先在PInoke中声明委托并定义事件。申明了一个新的委托类型ConnectionEventHandler,之所以新创建一个委托,是因为后面用到了一个自己新定义的PoCEventArgs类。然后定义了一个connectionEvent事件。 PoCEventArgs定义在Global类中。
public static event ConnectionEventHandler connectionEvent; // 定义事件
下面要将事件钩子与事件进行挂钩,使用+=符号,把delegate附加到事件上面去。放到了FrmLogin的构造函数中,但没有放入InitializeComponent()函数中,代码如下:
{
InitializeComponent();
PInvoke. connectionEvent += new PInvoke. ConnectionEventHandler( Register_Connection);
}
下面是PoCEventArgs的构造函数,在EventArgs的基础上新增了_event(用来传递模拟的登陆结果)和_msg。代码如下:
{
private string _msg = "";
private int _event = -9;
public PoCEventArgs() : base() { }
public PoCEventArgs(int aEvent) : base()
{
_event = aEvent;
}
public PoCEventArgs(int aEvent, string message) : base()
{
_msg = message;
}
public string Message
{
get { return _msg; }
set { _msg = value; }
}
public int Event
{
get { return _event; }
set { _event = value; }
}
}
在FrmLogin中调用PInvoke的Register函数后,下面由Register函数来生成PoCEvent事件。代码如下:
public void Register( int aTime, bool aISB, bool aIPAB, bool aAASetting)
{
//int aEvent = 0;
Global.PoCEventArgs ev = new Global.PoCEventArgs(aLoginEvent);
OnConnectionEvent(this, ev);
}
protected static void OnConnectionEvent( object sender, Global.PoCEventArgs ev)
{
if (connectionEvent != null)
connectionEvent(sender, ev);
}
由于前面已经将事件钩子与事件挂钩了,所以当PInvoke.connectionEvent事件发生到来时,FrmLogin开始调用Register_Connection函数。
{
int loginResult = e.Event;
lblTest.Text = loginResult.ToString();
}
这样一个流程就进行完了,由PInvoke类传过来的登陆结果在FrmLogin显示出来。