2014-10-08 104 views
1

我有一個事件,我註冊事件處理程序。如何避免多次註冊事件

event Action OnGameList; 

然後例如我到達像這樣的代碼:

backend.OnGameList += ProcessGameList; 
backend.GetGameList(); //this will trigger the above event. 
每個i達到這個代碼時間

,該處理程序中的溶液。這意味着第二次將被調用兩次。當然 我可以在這樣的功能將其刪除:

backend.OnGameList -= ProcessGameList; 

,但我有一種感覺,有這類問題更好的解決方案。

+1

沒有更多的代碼很難說。顯而易見的答案是隻在代碼中添加事件一次,而不是重複調用,但很難給出更具體的建議,而不理解爲什麼您已經多次添加它。 – Chris 2014-10-08 12:51:39

+0

您可以先安全地移除,然後重新添加。否則,你將不得不檢查它是否已經註冊。 – 2014-10-08 12:58:58

+1

我必須承認,如果我的設計只被我使用,並且我只想附加處理程序一次,即使附加例程被調用了n次(可以說每次自定義彈出窗口都會出現),我總是使用 - =之前+ =。它從未墜毀,並始終幫助。 IIRC。 – icbytes 2014-10-08 13:03:35

回答

3

我認爲你應該使用某種支持字段來跟蹤你已經訂閱。即

private bool _subscribed = false; 

    SubscribeToOnGameListEvent(); 
    backend.GetGameList(); 

    private void SubscribeToOnGameListEvent() 
    { 
     if (!_subscribed) 
     { 
      backend.OnGameList += ProcessGameList; 
      _subscribed = true; 
     } 
    } 
3

您可以檢查特別代表的存在調用列表:

class Foo 
{ 
    private EventHandler bar; 

    public event EventHandler Bar 
    { 
     add 
     { 
      if (bar == null) 
      { 
       bar = value; 
      } 
      else 
      { 
       if (!bar.GetInvocationList().Contains(value)) 
       { 
        bar += value; 
       } 
      } 
     } 
     remove 
     { 
      // ... 
     } 
    } 

    public void RaiseBar() 
    { 
     if (bar != null) 
     { 
      bar(this, EventArgs.Empty); 
     } 
    } 
} 
+0

這似乎是一個很好的解決方案,但是在我的具體情況下,我無法真正使用它,因爲我的事件是從WCF服務參考中自動生成的類。 – clamp 2014-10-09 12:41:40