** 第十一章 ** ** ** ** 事件 ** ** **
** 摘要: **
?????? 本章讲述事件的应用,包括:
n ???????? 发布事件设计模式
n ???????? 侦听事件的方法
n ???????? 显式控制事件注册
n ???????? 一个类型定义多个事件并减少内存资源
?
** 一、 ???????????? ** ** 发布事件 **
1 、发布事件的类型提供的功能:
l ???????? 允许其他对象登记事件
l ???????? 允许其他对象注销事件
l ???????? 维护一个登记对象列表,在事件发生时通知相应的登记对象
2 、发布事件步骤:
l ???????? 定义事件附加信息类型
l ???????? 定义事件触发时被调用的委托类型 (Delegate 回调函数 )
l ???????? 定义事件成员。形如: public event [EventName]EventHandler Msg;
l ???????? 定义一个受保护的虚方法( protected virtual ),负责通知事件的登记对象
l ???????? 定义一个将输入转化为事件的方法
3 、 .NET 框架的一些约定:
l ???????? .NET 框架建议附加信息类型名以 EventArgs 结尾 ([EventName]EventArgs) ;无需传递附加信息的事件使用 EventArgs.Empty 静态只读字段
l ???????? .NET 框架建议委托原形为: void [EventName]EventHandler ( Object sender, [EventName]EventArgs e ) ; 无需附加信息的直接用 System.EventHandler 委托类型,并使用 EventArgs.Emtpy 静态只读字段作为第 2 个参数
4 、对事件定义的剖析:
若发布事件的类型中有如下事件定义:
?
public event EventNameEventHandler EventMsg;
?
则被编译器翻译为:
?
private EventNameEventHandler EventMsg = null;
[MethodImplAttribute(MeghodImplOptions.Synchronized)] ?????? // 用于线程安全,需要开销
public void add_EventMsg(EventNameEventHandler handler)
{
?????? EventMsg = (EventNameEventHandler)Delegate.Combine(EventMsg, handler);
}
[MethodImplAttribute(MeghodImplOptions.Synchronized)] ?????? // 用于线程安全,需要开销
public void remove_EventMsg(EventNameEventHandler handler)
{
?????? EventMsg = (EventNameEventHandler)Delegate.Remove(EventMsg, handler);
}
?
联系显式定义事件的方法,有异曲同工之妙。
** 二、 ???????????? ** ** 侦听事件 **
侦听过程分为以下几个步骤:
l ???????? 定义事件通知回调函数,在其中处理到达的事件
l ???????? 登记本对象到发布事件的类型
l ???????? 注销本对象
** 三、 ???????????? ** ** 显式控制事件注册 **
显示控制事件注册是为了在单线程应用中消除由于线程同步带来的开销(见上面对事件定义的剖析),因此仅当无需线程同步时,显示发布事件才有用。
参考发布事件中的描述,显式控制事件注册只是将“定义事件成员”分解为:
l ???????? 定义委托类型
l ???????? 显式定义事件及访问器方法。注意必须同时定义 add 和 remove 方法
l ???????? 修改通知事件登记对象的方法,使用刚定义的委托类型
** 四、 ???????????? ** ** 定义多个事件 **
定义多个事件主要为了公开大量的事件但不为每个事件分配字段,使用哈希表或链表(如 FCL 中的 ** System.ComponentModel.EventHandlerList ** )存储这些事件实例。这只有在有非常多的事件且预期大部分事件都不实现时才有用。
?
理解这部分内容要抓住以下几个方面:
l ???????? 上面对事件定义的剖析,其中的方法也是在集合中添加事件委托的方法
l ???????? 为每种事件建立一个唯一键(通过建立一个静态只读对象来标识)用以标识事件
l ???????? 其余同单一事件的发布
** 五、 ???????????? ** ** 示例 **
请参阅另一篇文章 “ 第十一章 多事件示例 [ 一个 男 人和三个女人的故事 ] ”
** ? **
** 本章牵涉到的其他知识点: **
ü ???????? 委托的应用(第十七章详述)
ü ???????? 线程安全的保障
ü ???????? 散列表( Hashtable )的应用
在后续笔记中会有详述。 ** **
?