【问题标题】:C# event subscribe and unsubscribe duplicatesC# 事件订阅和取消订阅重复项
【发布时间】:2013-01-22 19:58:43
【问题描述】:

如果我用 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

【问题讨论】:

  • 看到这个问题:stackoverflow.com/questions/817592/…,基本上,是的,但你可以避免它。
  • 试试看会发生什么!不过我很好奇,当每个执行路径都包含相同的结果时,它们背后的想法是什么?
  • 因此,如果尚未注册,基本上没有取消订阅 (-=) 的副作用。对吗?
  • 为什么要多次订阅同一个事件?你到底想解决什么问题?
  • 有多个可能需要它的代码路径。所以我想避免检查它是否已经一次又一次地注册。谢谢

标签: c# event-handling


【解决方案1】:

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

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

取消订阅您尚未订阅的事件没有问题。

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

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

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

【讨论】:

  • 好吧,多次订阅一个事件可能有问题,也可能没有问题。您可能希望多次触发事件处理程序。
  • @Servy - 严格来说你是对的,但这不是问题的意图。
【解决方案2】:

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

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

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

是的。

最好的处理方法是什么?

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

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

退订未注册的活动是否有问题?

不,它什么都不做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多