2011-12-16 34 views
1

我有一个设置,其中两个实例(A,B)正在侦听第三个实例(C)上的事件。 A也有对B的引用。C#:自定义事件调用与最后一分钟检查,看看用户是否真的仍在订阅?

当事件在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); 
    } 
+0

不要尝试。事件是一种特殊类型的委托,它是一种不可变的值类型。在触发该事件的同时从事件中移除一个用户是困难的,但并非不可能。除此之外,没有保证订单应该被通知的顺序。真正的课程问题伴随着事件的哲学。你只是在试图滥用一个系统。而是在B实例上设置一个属性。 – Polity 2011-12-16 10:09:24

回答

0

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

最简单的是有B设置一个老式的布尔标志时,将注销,如果做一个顶级(未注册==真)返回;在事件处理程序中。

相关问题