2013-01-22 188 views
7

如果我使用eventHandler订阅同一事件三次,是否有问题? 例如C#事件订阅和取消订阅重复项

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 
+0

看到这个问题:http://stackoverflow.com/questions/817592/avoid-duplicate-event-subscriptions-in-c-sharp,基本上,是的,但你可以避免它。 – Sean

+1

尝试一下,看看会发生什么!然而,我很好奇,当每一个结果都包含相同的结果时,具有排他执行路径背后的想法是什么? –

+0

所以基本上没有取消订阅( - =)的副作用,如果它尚未注册。正确? – user236215

回答

12

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

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

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

所以,如果你不知道你的应用程序处于什么状态(虽然你真的应该是)你可以有:

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

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

+0

那么,订阅一个活动不止一次可能会成为问题。您可能*想*让事件处理程序多次触发。 – Servy

+0

@Servy - 严格来说你是对的,但这不是问题的意图。 – ChrisF

+0

完美,谢谢! – user236215

4

如果我用eventHandler三次订阅同一个事件,是否有问题?

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

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

是的。

什么是最好的处理方法?

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

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

是否有一个问题与退订未注册的事件?

不,它什么也不做。