C#中的委托和事件机制

最近在做的项目是用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   delegate   void  ConnectionEventHandler( object  sender, Global.PoCEventArgs e);  // 声明委托
public   static   event  ConnectionEventHandler connectionEvent // 定义事件

下面要将事件钩子与事件进行挂钩,使用+=符号,把delegate附加到事件上面去。放到了FrmLogin的构造函数中,但没有放入InitializeComponent()函数中,代码如下:

        public FrmLogin()
        {
            InitializeComponent();
            PInvoke. connectionEvent += new PInvoke. ConnectionEventHandler( Register_Connection);
        }

下面是PoCEventArgs的构造函数,在EventArgs的基础上新增了_event(用来传递模拟的登陆结果)和_msg。代码如下:

class Global
{         
            public   class  PoCEventArgs : EventArgs
       
{
            
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事件。代码如下:

         private   int  aLoginEvent  =   0 // 登陆结果
         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函数。

         private   void  Register_Connection( object  sender, Global.PoCEventArgs e)
      
{
            
int loginResult = e.Event;
           lblTest.Text 
= loginResult.ToString();
        }

这样一个流程就进行完了,由PInvoke类传过来的登陆结果在FrmLogin显示出来。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值