private TBufferedResponseReceiver GetResponseReceiver(string responseReceiverId) { using (EneterTrace.Entering()) { TBufferedResponseReceiver aResponseReceiver = myResponseReceivers.FirstOrDefault(x => x.ResponseReceiverId == responseReceiverId); return(aResponseReceiver); } }
public void SendResponseMessage(string responseReceiverId, object message) { using (EneterTrace.Entering()) { // If it is a broadcast response message. if (responseReceiverId == "*") { using (ThreadLock.Lock(myResponseReceivers)) { TBroadcast aBroadcastMessage = new TBroadcast(message); myBroadcasts.Add(aBroadcastMessage); foreach (TBufferedResponseReceiver aResponseReceiver in myResponseReceivers) { // Note: it does not throw exception. aResponseReceiver.SendResponseMessage(message); } } } else { bool aNotifyOffline = false; using (ThreadLock.Lock(myResponseReceivers)) { TBufferedResponseReceiver aResponseReciever = GetResponseReceiver(responseReceiverId); if (aResponseReciever == null) { aResponseReciever = CreateResponseReceiver(responseReceiverId, "", true); aNotifyOffline = true; } aResponseReciever.SendResponseMessage(message); if (aNotifyOffline) { ResponseReceiverEventArgs anEvent = new ResponseReceiverEventArgs(responseReceiverId, ""); Dispatcher.Invoke(() => Notify(ResponseReceiverOffline, anEvent, false)); } } } } }
private TBufferedResponseReceiver CreateResponseReceiver(string responseReceiverId, string clientAddress, bool notifyWhenConnectedFlag) { using (EneterTrace.Entering()) { TBufferedResponseReceiver aResponseReceiver = new TBufferedResponseReceiver(responseReceiverId, myInputChannel); // Note: if it is created as offline then when the client connects raise ResponseReceiverConnected event. aResponseReceiver.PendingResponseReceiverConnectedEvent = notifyWhenConnectedFlag; myResponseReceivers.Add(aResponseReceiver); // If it is the first response receiver, then start the timer checking which response receivers // are disconnected due to the timeout (i.e. max offline time) if (myResponseReceivers.Count == 1) { myMaxOfflineChecker.Change(300, -1); } return(aResponseReceiver); } }
private void OnResponseReceiverDisconnected(object sender, ResponseReceiverEventArgs e) { using (EneterTrace.Entering()) { bool aNotify = false; using (ThreadLock.Lock(myResponseReceivers)) { TBufferedResponseReceiver aResponseReciever = GetResponseReceiver(e.ResponseReceiverId); if (aResponseReciever != null) { aResponseReciever.IsOnline = false; aNotify = true; } } if (aNotify) { Notify(ResponseReceiverOffline, e, false); } } }