2009-06-17 17 views
5

Ich möchte jede Sekunde von Net Tcp WCF-Dienst an alle Clients eine Benachrichtigung senden, Broadcast können Sie sagen?Wie kann ich eine Benachrichtigung vom Server an alle Clients in WCF senden (Broadcast können Sie sagen)?

Nachdem die hilfreichen Antworten

Ich schrieb die folgende Methode, die Benachrichtigungen (Herzschlag) an alle angeschlossenen Nutzer

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); 
    } 
    } 
); 
} 

Ich bin besorgt über den Aufruf der Callback-Methode als Client senden kann seine Anwendung schließen , aber ich habe es mit dem try-catch behandelt, verringere die Zeitüberschreitung und sende die Broadcasts parallel, also ist das ausreichend?

Antwort

5

Sie müssen einen Rückrufdienst einrichten; Ich schrieb eine simple beginners guide eine Weile zurück

+1

der Artikel ist sehr nett, aber ich fand, dass es die Daten in Serie zu den angeschlossenen Clients sendet, das bedeutet, wenn ein Client seine Anwendung während des Sendens geschlossen wird warten bis Timeout auftritt, das passiert mir, wenn ich denselben Code anwendete, wie kann ich das lösen (Timeout sehr klein machen?) –

+0

Sie können es lösen, indem Sie, wie Sie sagen, das Timeout für den Rückwärtsanruf verringern, oder, sinnvoller, setzen Callbacks in Hintergrund-Worker-Threads, so dass sie parallel laufen. Es war nur eine Demo :) – blowdart

+1

Antworten sollten nicht auf externe Ressourcen verlinken, ohne ausreichende Details in der Post selbst bereitzustellen. Die Verbindung ist tot und jetzt ist die Antwort nutzlos. – MrZander

2

Um dies zu tun, müssen Sie eine Liste aller verbundenen Clients erstellen und verwalten (die allgemeine Praxis für das Erstellen von LogIn und LogOut-Methoden zum Erstellen und Verwalten einer Liste von Objekten, die Ihre Clients einschließlich CallbackContext darstellen) . Dann können Sie mit einem System.Time.Timers die verbundene Client-Liste durchlaufen und die Benachrichtigung senden.

Tipp. Diese Methode kann auch als Keep-Alive- oder Hear-Beat-Methode (falls dies nicht beabsichtigt ist) verwendet werden, indem die Möglichkeit hinzugefügt wird, Clients aus Ihrer Liste zu entfernen, wenn der Dienst den Rückruf nicht an sie senden kann.