2009-06-17 18 views
5

Deseo enviar un mensaje de notificación cada segundo desde el servicio de WCW de net tcp a todos los clientes, Transmisión que puede decir?¿Cómo puedo enviar un mensaje de notificación desde el servidor a todos los clientes en WCF (difusión que puede decir)?

Después de las respuestas votos

me escribió el siguiente método que va a enviar notificaciones (latido) a todos los usuarios conectados

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

me preocupa de llamar al método de devolución de llamada que el cliente pueda cerrar su aplicación , pero lo manejé usando la captura de prueba, disminuí el tiempo de espera y envié el lanzamiento amplio en paralelo, ¿es eso suficiente?

Respuesta

5

Tendrá que configurar un servicio de devolución de llamada; Escribí un simple beginners guide hace un tiempo

+1

el artículo es muy bueno, pero encontré que envía los datos en serie a los clientes conectados, esto significa que si un cliente cerró su aplicación durante el envío el sistema esperará hasta que se agote el tiempo de espera, esto me sucede cuando apliqué el mismo código, ¿cómo puedo solucionar esto? (haga que el tiempo de espera sea muy pequeño?) –

+0

Puede resolverlo ya sea, como usted dice, reduciendo el tiempo de espera para la llamada hacia atrás o, más sensatamente, poniendo el las devoluciones de llamada en subprocesos de trabajo en segundo plano, por lo que se ejecutan en paralelo. Fue solo una demostración :) – blowdart

+1

Las respuestas no deben vincular a los recursos externos sin proporcionar suficientes detalles en la publicación. El enlace está muerto y ahora la respuesta es inútil. – MrZander

2

Para hacer eso, necesita crear y mantener una lista de todos los clientes conectados (la práctica general es crear métodos LogIn y LogOut para crear y administrar una lista de objetos que representan sus clientes incluyendo su CallbackContext) . Luego, con un System.Time.Timers, puede recorrer la lista de clientes conectados y enviar la notificación.

Sugerencia. este método también podría actuar como un método Keep-Alive o Hear-Beat (si este no es su propósito por diseño) agregando la posibilidad de eliminar clientes de su lista si el servicio no puede enviarles la devolución de llamada.

Cuestiones relacionadas