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