执行您自己的自定义 .NET 事件处理循环
-
03-07-2019 - |
题
几年前,我读过一本书,其中描述了如何使用自己的处理器覆盖 .NET 中的默认事件“调度程序”实现。
class foo {
public event EventHandler myEvent;
...
}
...
myFoo.myEvent += myBar1.EventHandler;
myFoo.myEvent += myBar2.EventHandler;
每当事件触发时,myBar1 和 myBar2 处理程序都会被调用。
我记得,此循环的默认实现使用链接列表,并简单地迭代该列表并按顺序调用 EventHandler 委托。
我的问题有两个:
- 有人知道我在读哪本书吗?
- 为什么要覆盖默认实现(这可能会在书中得到解答)?
编辑:我所指的书确实是 Jeffrey Richter 的《CLR via C#》
解决方案
它可能是许多书籍或网络文章中的一本。
您可能想要更改事件订阅/取消订阅方式的原因有多种:
- 如果您有很多活动,其中许多活动很可能没有订阅,您可能需要使用 事件处理器列表 降低内存使用量
- 您可能希望记录订阅/取消订阅
- 您可能希望使用弱引用来避免订阅者的生命周期与您的生命周期绑定
- 您可能希望更改与订阅/取消订阅相关的锁定
我确信还有更多 - 这些都超出了我的想象:)
编辑:另请注意,处理订阅/取消订阅的自定义方式与引发事件的自定义方式(例如,可以调用 GetInitationList 并保证调用所有处理程序,无论异常如何)之间存在差异。
其他提示
我似乎在Jeffrey Richter的CLR中通过C#记住了类似的东西。 编辑:我绝对记得他详细介绍过它。
控制事件注册有几个不同的原因。其中之一是当你有很多事件时减少代码膨胀。我认为杰弗里在书中详细介绍了这一点......
- 不
- 例如,您可能需要根据处理程序之一的结果来中断调用链。假设您的 CustomEventArgs 对象有一个属性“Blocked”,当设置为 true 时,会抑制所有进一步的事件处理程序调用。
不隶属于 StackOverflow