1

我有一个设置,其中两个实例(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);
  }
4

1 回答 1

0

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

最简单的方法是让 B 在注销时设置一个老式的 bool 标志并执行顶级 if(unregistered==true) return; 在事件处理程序中。

于 2011-12-16T10:11:07.977 回答