2009-06-17 35 views
5

我想每秒從網絡tcp WCF服務向所有客戶端發送通知消息, 您可以說廣播嗎?如何從服務器向WCF中的所有客戶端發送通知消息(您可以說廣播)?

的有用的答案後

我寫了下面的方法將發送通知(心跳)給所有連接的用戶

foreach (IHeartBeatCallback callback in subscribers) 
{ 
    ThreadPool.QueueUserWorkItem(delegate(object state) 
    { 
    ICommunicationObject communicationCallback = (ICommunicationObject)callback; 
    if (communicationCallback.State == CommunicationState.Opened) 
    { 
     try 
     { 
     callback.OnSendHeartBeat(_heartbeatInfo.message, _heartbeatInfo.marketstart,_heartbeatInfo.marketend, _heartbeatInfo.isrunning, DateTime.Now); 
     } 
     catch (CommunicationObjectAbortedException) 
     { 
     Logger.Log(LogType.Info, "BroadCast", "User aborted"); 
     communicationCallback.Abort(); 
     } 
     catch (TimeoutException) 
     { 
     Logger.Log(LogType.Info, "BroadCast", "User timeout"); 
     communicationCallback.Abort(); 
     } 
     catch (Exception ex) 
     { 
     Logger.Log(LogType.Error, "BroadCast", "Exception " + ex.Message + "\n" + ex.StackTrace); 
     communicationCallback.Abort(); 
     } 

    } 
    else 
    { 
     DeletionList.Add(callback); 
    } 
    } 
); 
} 

我擔心調用回調方法,客戶端可能會關閉他的申請,但我使用try catch來處理它,減少超時並且並行地發送廣播,那麼足夠了嗎?

回答

5

您需要設置回撥服務;我寫了一個simple beginners guide一會兒回

+1

這篇文章很不錯,但是我發現它發送的數據是連接到客戶端的,這意味着如果一個客戶端在發送系統的時候關閉了他的應用程序就會等到超時發生,這發生在我身上時,我應用了相同的代碼,我該如何解決這個問題(使超時很小?) – 2009-06-17 14:16:52

2

爲了做到這一點,您需要創建並維護所有連接客戶端的列表(一般的做法是創建LogIn和LogOut方法來創建和管理表示包含CallbackContext的客戶端的對象列表) 。 然後,通過System.Time.Timers,您可以遍歷連接的客戶端列表併發送通知。

提示。如果服務無法將回調發送給他們,則該方法還可以充當Keep-Alive或Hear-Beat方法(如果這不是通過設計的目的),則可以添加刪除客戶端的可能性。

相關問題