C#禁用事件处理程序问题

3
我正在使用TextChanged事件,并在不需要时禁用它,如下所示。
object.Event -= new System.EventHandler(myHandler);
//my code which doesn't need event handler
object.Event += new System.EventHandler(myHandler);

我经常像这样使用。但有时我需要禁用类似于以下代码的内容:
object.Event -= new System.EventHandler(myHandler);
object.Event -= new System.EventHandler(myHandler);

当然,我用了两个启用代码来完成它。
object.Event += new System.EventHandler(myHandler);
object.Event += new System.EventHandler(myHandler);

我还不知道为什么需要两次删除事件处理程序,但它很好用。

但有一个情况出了问题。

如果有2个或更多的禁用代码,它将不起作用。

我的问题是,如果此事件处理程序只需要一个-=代码或更多,我该如何监视它? 或者我该如何管理它? 我总是这样工作,以确保我始终将事件处理程序留在第一次。

object.Event -= new System.EventHandler(myHandler);
//my code which doesn't need event handler
object.Event += new System.EventHandler(myHandler);
2个回答

10

我的建议是停止移除和重新添加事件处理程序,而是在事件处理程序本身中添加一个标志,以抑制您需要在这些代码段期间抑制的任何活动。

您可以使用单个布尔标志,也可以根据需要处理嵌套使用某种引用计数。

如果有某些原因导致您无法更改现有的事件处理程序,那么创建一个新的事件处理程序并将其附加到事件中,然后从其中调用旧处理程序如何?


太好了!很高兴能帮到您。您是新来的 - 别忘了给您喜欢的内容或接受的答案投票。 - Will Dean

4
您需要删除与添加次数相同的事件处理程序 - 但您无法知道何时进行操作,因为订阅对您来说实际上是隐藏的。最好的方法是仅订阅所需的次数,并且应该明确需要取消订阅的次数。通常只需要订阅一次。如果您最初有两个订阅,则有点奇怪...我怀疑这可能表示您的代码中存在错误。请注意,使用尚未订阅的事件处理程序进行取消订阅是无操作的。(顺便说一下,Will关于事件处理程序本身是否真正“活动”的想法也很好。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接