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

时间:2010-07-20 08:30:10

标签: c# event-handling events

我正在使用textchanged事件,我禁用它,我不需要如下

object.Event -= new System.EventHandler(myHandler);
//my code which doesn't need event handler
object.Event += new System.EventHandler(myHandler);
我经常使用这样的次数。但我有时需要2个禁用代码:

object.Event -= new System.EventHandler(myHandler);
object.Event -= new System.EventHandler(myHandler);

当然我用2启​​用代码

完成了它
object.Event += new System.EventHandler(myHandler);
object.Event += new System.EventHandler(myHandler);

我不知道为什么我需要2次删除事件处理程序,但它工作得很好。

但在1例中我遇到了问题。

它不适用于2个或更多禁用代码。

我的问题是,如果它只需要一个 - =代码或更多,我怎么能看到这个事件处理程序? 或者我该如何管理呢? 我总是像这样工作,以确保我总是第一次离开事件处理程序

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

2 个答案:

答案 0 :(得分:10)

我的建议是停止删除并重新添加事件处理程序,而是向事件处理程序本身添加一个标志,该标志禁止在这些代码段中需要禁止的任何活动。

您可以使用单个布尔标志,也可以使用某种引用计数,具体取决于您需要如何处理嵌套。

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

答案 1 :(得分:4)

您需要在添加事件处理程序时多次删除它 - 而且您无法判断它是什么时候,因为订阅对您有效隐藏。

理想情况下,只需确保您只需要订阅多次,并且很明显您需要多少次取消订阅。通常这将是一次。你有两个订阅开始时有点奇怪...我怀疑这可能表明代码中的某个地方存在错误。

请注意,使用尚未订阅的事件处理程序取消订阅是无操作。

(Will知道事件处理程序本身知道它是否真的“活跃”也是一个好的,顺便说一句。)