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