9

如果我用 eventHandler 订阅同一个事件 3 次,会不会有问题?例如

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

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

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

同样,取消订阅未注册的事件是否存在问题?例如

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

2 回答 2

13

如果您多次订阅一个事件,那么您的处理程序将被调用相应的次数 - 在您的示例中为 3 次。

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

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

因此,如果您不确定您的应用程序处于什么状态(尽管您确实应该处于这种状态),您可以:

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

(注:new EventHandler(...)is 语法糖,可省略)

于 2013-01-22T20:04:10.493 回答
5

如果我用 eventHandler 订阅同一个事件 3 次,会不会有问题?

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

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

是的。

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

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

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

取消订阅未注册的活动是否存在问题?

不,它什么也不做。

于 2013-01-22T20:08:37.550 回答