2013-01-22 221 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); 

是否有一個問題與退訂未註冊的事件?

不,它什麼也不做。