c#:自定义事件调用,在最后一分钟检查订阅者是否真的还在订阅

本文关键字:是否 真的 检查 最后一分钟 自定义 事件 调用 | 更新日期: 2023-09-27 18:18:15

我有一个设置,其中两个实例(a, B)正在监听第三个实例(C)上的事件。a也有对B的引用。

当事件在C上触发时,A首先接收它,然后直接处置B(根据设计)。在dispose方法中,B删除C(-=)上事件的侦听器。接下来发生的事情是,即使B取消订阅了C上的事件,B仍然接收来自C的回调。

我猜这是预料之中的,因为调用列表可能只在事件触发时构建(当两个侦听器仍然存在时),并且即使在调用循环期间碰巧有一个实例退订,也不会重新构建。

我的问题是,如果对象真的还在订阅事件,为什么在事件引发之前没有二次检查?我想这对性能是不利的,这是一个非常罕见的情况。但如果我想自己实现这个行为呢?

我尝试过这样的东西,但我不确定这是否是所有需要的(它似乎工作虽然)。c#内部的调用循环是怎样的?

  foreach(var e in Test.GetInvocationList())
  {
    if (!Test.GetInvocationList().Contains(e)) continue;
    e.DynamicInvoke(this, EventArgs.Empty);
  }

c#:自定义事件调用,在最后一分钟检查订阅者是否真的还在订阅

通过调用列表等没有干净的方法。

最简单的是让B在注销时设置一个老式的bool标志,并执行顶级if(unregistered==true)返回;