CLR事件模型

CLR事件模型通俗说就是直接事件模型。事件的前身就是消息(Message),Windows是消息驱动的操作系统,运行其上的程序也遵照这个机制运行。消息本身就是一条数据,这条数据里记载着消息的类别,必要的时候还记载一些消息参数。比如,当你的窗体上按下鼠标左键的时候,一条名为WM_LBUTTONDOWN消息就被生成并加入到Windows待处理的消息队列中,并等待被处理。当Windows处理到这条消息时会把消息发送给你单击的窗体,窗体会用自己的一套算法来响应这个消息,这个算法就是Windwos API开发中的消息处理函数。消息处理函数中有一个多级嵌套的switch结构,进入这个switch机构的消息会被分门别类并流入某个分支,在这个分支里会有一个由程序员编写的函数被调用。例如对WM_LBUTTONDOWN这个消息,程序员可能会编写一个函数来查看它所携带的参数(即鼠标单击出的X,Y坐标),然后决定是把它们显示出来还是在这个点上绘制图像等。也由的消息是不带参数的,比如按钮被单击的消息,当流入某个分支后程序员就知道是按钮被单击了。

然而对于消息驱动机制,仍然有很多复杂的地方,在.net框架中将消息驱动进一步封装成了更容易让人理解的事件模型。在事件驱动机制中将消息驱动简化为三个关键点:

1、事件的拥有者:即消息的发送者。事件的宿主可以在某些条件下激发事件

2、事件的响应者:即消息的接收者,处理者。事件接收者使用其事件处理器对事件作出响应

3、事件的订阅关系:事件的拥有者可以随时激发事件,但是事件发生后会不会得到响应要看有没有事件的响应者,或者是说这个事件有没有被关注。如果对象A关注对象B的某个事件是否发生,则称A订阅了B的事件,更进一步讲,事件实际上是一个使用Event关键字修饰的委托类型成员变量,事件处理器则是一个函数,说A订阅了B的事件,本质上是让B.Event与A.EventHandler关联起来。所谓事件激发就是B.Event被调用,这时,与其关联的A.EventHandler就会被调用

举个简单的例子,在窗体上放置一个button按钮,创建button的Click事件处理器,对于这个事件模型的几个关键部分:

事件拥有者:button按钮

事件:button.Click

事件的响应者:窗体本身

事件处理器:this.button_Click方法

订阅关系:this.button.Click+=new system.EventHandler(this.button_Click );

原文地址:https://www.cnblogs.com/zcftech/p/2939321.html