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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#事件订阅和取消订阅重复项相关的知识,希望对你有一定的参考价值。

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

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
答案

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

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

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

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

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

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

另一答案

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

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

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

是。

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

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

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

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

不,它什么都不做。

以上是关于C#事件订阅和取消订阅重复项的主要内容,如果未能解决你的问题,请参考以下文章

订阅/取消订阅列表中的事件[重复]

如何取消订阅RxKotlin / RxJava中的Flowable?

EventBus事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )

取消订阅从未订阅过的事件是不是安全?

EventBus事件通信框架 ( 取消注册 | 获取事件参数类型 | 根据事件类型获取订阅者 | 移除相关订阅者 )

如何正确取消订阅事件