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