.Net事件处理原理

    关于.Net事件的实现原理,很多文章说.Net的事件处理基于Windows的消息机制,顺着这条线,加上自己的一点点c语言基础,简单写了一个消息处理的小Demo,本人对c理解较少,写的这个Demo还有一些小问题,但是能执行,个人认为也能将消息机制说清楚,直接上代码。

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <signal.h>

#include <time.h>  

time_t rawtime;

struct tm * timeinfo;

//捕捉到消息后要执行的函数

void Catch_Signal(int sign)

{

         switch(sign)

         {

         case SIGINT:

                   time(&rawtime);

                   timeinfo = localtime (&rawtime);

                   printf ( "\007The current date/time is: %s", asctime (timeinfo) );

         }

}

 

int main(int arg,char* args[])

{

        //向系统注册消息的处理函数

         signal(SIGINT,Catch_Signal);

         while(1)

         {

         }

         return 0;

}

    直接运行上述代码,按下Ctrl+c发送消息,报一个异常之后还是正常运行起来了。我们的重点是讨论.Net的消息机制,我们抛开这个异常,只看消息的处理过程。首先我们通过signal函数注册SIGINT消息的处理函数Catch_Signal,即系统捕捉到SIGINT消息(终止)后将SIGINT作为参数传递给Catch_Signal函数,之后开始执行Catch_Signal函数。

    好了,c语言的说完了,现在我们看C#.Net的代码。

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

           //将自己写的事件绑定至button1.Click

            button1.Click += button2_Click;

        }

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show("Hello,button1_Click");

        }

        //自己模仿自动生成的button1_Click写的事件。

        private void button2_Click(object sender, EventArgs e)

        {

            MessageBox.Show("Hello,button2_Click");

        }

    }

}

    执行结果是弹两次MessageBox,分别是Hello,button1_Click和Hello,button1_Click。截止到目前,我感觉思路就比较清晰了。操作系统监视消息,消息来时,分发给对应的应用程序,我们写的函数满足.Net事件处理的函数签名时,就可以和.Net的事件处理实现绑定,例如上述代码的button1.Click += button2_Click,其实这一步就是一个多播委托,满足事件处理函数签名的函数会依次被触发。

    其实后面的解释我觉得说的不是很好,重点看代码吧,我觉得结合c的代码及c#的代码,更好理解.Net事件处理机制。至于网上经常说的【.Net事件就是封装一个委托】,我刚开始看也是觉得蛮抽象的,其实综合上述代码,我还是慢慢理解了,这里说的封装一个委托,其实就是把【private void button1_Click(object sender, EventArgs e)】和【private void button2_Click(object sender, EventArgs e)】函数以委托做函数参数的方式,传递给另外事件绑定函数,对应开始的c代码,就是将Catch_Signal函数以函数指针的方式传递给消息捕捉函数signal

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。