做自己的自定义.NET事件处理循环
时间:2020-03-06 15:01:49 来源:igfitidea点击:
几年前,我读了一本书,描述了如何使用自己的处理器覆盖.NET中的默认事件'dispatcher'实现。
class foo { public event EventHandler myEvent; ... } ... myFoo.myEvent += myBar1.EventHandler; myFoo.myEvent += myBar2.EventHandler;
每当事件触发时,都会调用myBar1和myBar2处理程序。
我记得,该循环的默认实现使用链接列表,并仅在列表上进行迭代并按顺序调用EventHandler委托。
我的问题有两个:
- 有人知道我在读哪本书吗?
- 为什么要覆盖默认实现(本书中可能会回答)?
编辑:我所指的书确实是杰弗里·里希特(Jeffrey Richter)通过C#编写的CLR
解决方案
我似乎还记得杰弗里·里希特(Jeffrey Richter)通过C#编写的CLR中的类似内容。编辑:我绝对记得他详细介绍了它。
控制事件注册有几种不同的原因。其中之一是减少发生大量事件时的代码膨胀。我认为杰弗里在书中对此进行了详细介绍...
- 不
- 例如,我们可能需要根据其中一个处理程序的结果来中断调用链。假设CustomEventArgs对象具有"已阻止"属性,将其设置为true时将禁止所有进一步的事件处理程序调用。
它可能是许多书籍或者网络文章之一。
出于各种原因,我们可能想要更改事件的订阅/取消订阅方式:
- 如果我们有许多事件,其中许多事件很可能未被订阅,则可能要使用EventHandlerList来降低内存使用量
- 我们可能希望登录订阅/取消订阅
- 我们可能希望使用弱引用以避免订阅者的寿命与寿命联系在一起
- 我们可能希望更改与订阅/取消订阅关联的锁定
我确定还有更多的东西不在我的脑海:)
编辑:还请注意,使用自定义的方式处理订阅/取消订阅和使用自定义的方式引发事件(例如,可以调用GetInvocationList并确保所有处理程序都被调用,无论是否发生异常)之间都有区别。