2010-08-30 80 views
5

在我的代碼中的一個點,我訂閱the following event: -如何在.NET中檢查事件是否已訂閱?

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

的偉大工程,在消息隊列的收到完成事件觸發,我的委託處理它。

現在,我希望在訂閱它之前檢查事件是否已訂閱。我得到一個編譯時錯誤,當我做: -

// Compile Time Errors... 
if (UploadFolderMessageQueue.ReceiveCompleted == null) 
    { 
     UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
     UploadFolderMessageQueue.Formatter = 
      new XmlMessageFormatter(new[] {typeof (string)}); 
    } 

事件 「System.Messaging.MessageQueue.ReceiveCompleted」 只能出現在左邊的+ =或 - =

我知道這是令人尷尬的簡單..但我難倒:(任何建議?

+0

您應該嘗試設計您的代碼,以便以可預測的方式訂閱和取消訂閱。 – 2010-08-30 05:01:54

回答

13

你不能從用戶到事件做到這一點,只有發佈者可以檢查是否有任何用戶。喲ü將需要使用一些其他機制來跟蹤訂閱的類,如:

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 
bool handlerAttached=true; 

那麼你可以使用這個:

聲明
if(handlerAttached) 
{ 
    //DO YOUR STUFF 
} 
0

空測試只能在類中進行的事件(即UploadFolderMessageQueue類型)

1)如果您有權訪問此類的源,則可以添加執行測試的方法或屬性,並返回布爾結果,您可以在訂閱之前檢查該結果。 2)如果你不能修改聲明類,並且你只是從你自己的代碼中檢查重新訂閱,你可以單獨將訂閱記錄在一個布爾變量中,然後在試圖(重新)之前檢查該變量,訂閱。

3)如果您不能更改聲明類,並且您正在從代碼以外的代碼檢查訂閱,那麼看起來似乎沒有解決方案。

14

如果您需要確保只有一個用戶,你可以使用下面的代碼:

UploadFolderMessageQueue.ReceiveCompleted -= UploadMSMQReceiveCompleted; 
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted; 

如果UploadFolderMessageQueue.ReceiveCompletednull然後第一行會做什麼,在其他情況下,事件處理程序將除去。這意味着UploadFolderMessageQueue.ReceiveCompleted將始終只有一個訂閱者(當然,如果UploadMSMQReceiveCompleted是該事件的唯一一個事件處理程序)。