2011-04-25 124 views
4

這是我的WCF服務。我想通知 多個訂戶並進行一些更新並異步執行。我怎麼做?WCF異步通知用戶

// Callback contract 
public interface IMyServiceCallback 
{ 
    [OperationContract] 
    void Notify(String sData);  
} 

public class MyService:IMyService 
{ 
    List<IMyServiceCallback> _subscribers = new List<IMyServiceCallback>(); 

    // This function is used to subscribe to service. 
    public bool Subscribe() 
    { 
     try 
     { 
      IMyServiceCallback callback = OperationContext.Current.GetCallbackChannel<IMyServiceCallback>(); 
     if (!_subscribers.Contains(callback)) 
      _subscribers.Add(callback); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

// this function is used to notify all the subsribers 
// I want ForEach to be asynchronous. 
public void OnGetMsg(string sData) 
{ 
    _subscribers.ForEach(
      callback => 
      { 
       if (((ICommunicationObject)callback).State == CommunicationState.Opened) 
       { 
        callback.Notify(sData); //THIS OPERATION 
       } 
       else 
       { 
        _subscribers.Remove(callback); 
       } 
      }); 
    } 
} 
+0

另外,我是誰認爲WCF是在痛苦中唯一一個頸部? (你知道我的意思。) – 2011-04-25 08:33:51

+0

你的代碼在哪裏?異常或邏輯(算法)問題? – 2011-04-25 08:47:54

+0

如果其中一個用戶死了,那麼'callback.Notify()'會出現超時異常。由於向其他用戶發送的通知延遲了。 – 2011-04-25 08:50:38

回答

1

你可以把它的線程池:

ThreadPool.QueueUserWorkItem(o => callback.Notify(sData)); 

要知道,當你有很多不好的用戶可能會堵塞你的線程池。您可能想要捕獲異常並在失敗時刪除回調。

更新:如果你不想使用.NET線程池,那麼你可以滾你自己或例如使用SmartThreadPool

+0

這不是一個好主意,因爲您很可能會使用WCF引擎用來處理輸入請求的線程。 – 2011-04-25 10:56:26

+0

然後使用不同的線程池 – ChrisWue 2011-04-25 11:09:08