做自己的自定义.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并确保所有处理程序都被调用,无论是否发生异常)之间都有区别。