2009-06-17 66 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方法(如果这不是通过设计的目的),则可以添加删除客户端的可能性。

相关问题