C#事件订阅和取消订阅重复项

时间:2013-01-22 19:58:44

标签: c# event-handling

如果我使用eventHandler订阅同一个事件三次会有问题吗? e.g。

a.SomethingChanged += new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);

这是否会导致ChangeHandler被调用3次而不是1次?处理这个问题的最佳方法是什么?

请注意,这些冗余不在一起,而是代码路径的不同区域。

同样,从未注册的事件取消订阅是否存在问题? e.g。

a.SomethingChanged -= new EventHandler(ChangeHandler);  //ChangeHandler was never registered

2 个答案:

答案 0 :(得分:12)

如果您不止一次订阅某个活动,那么您的处理程序将被调用相应的次数 - 在您的示例中为三次。

这是否是一个问题取决于你的事件处理程序的作用,但我假设你不希望它被多次调用。

取消订阅您尚未订阅的活动没有任何问题。

因此,如果您不确定您的申请所处的状态(尽管您确实应该这样),您可以:

a.SomethingChanged -= ChangeHandler;
...
a.SomethingChanged += ChangeHandler;

(注意:new EventHandler(...)是语法糖,可以省略)

答案 1 :(得分:4)

  

如果我使用eventHandler订阅同一个事件三次会有问题吗?

不,它只会添加三次事件处理程序。

  

这是否会导致ChangeHandler被调用3次而不是1?

  

处理此问题的最佳方法是什么?

这取决于你想要的东西;你没有指定。如果你想要一种添加事件处理程序的方法,当且仅当它尚未添加时,只需删除事件处理程序然后再添加它:

a.SomethingChanged -= new EventHandler(ChangeHandler);
a.SomethingChanged += new EventHandler(ChangeHandler);
  

从未注册的事件中取消订阅是否存在问题?

不,它什么都不做。