public void EnqueueChangeForBroadcast(ChangeToBroadcast ctb) { lock (broadcastQueue) { broadcastQueue.Add(ctb); loopEvent.Set(); } }
public Task BroadcastChange(ChangeToBroadcast ctb) { List <Task> tasks = new List <Task>(); string updMsg = "UPDATE " + ctb.NewDocRevisionId + " " + ctb.SourceSessionKey + " " + ctb.SelJson; if (ctb.ChangeJson != null) { updMsg += " " + ctb.ChangeJson; } string ackMsg = "ACKCHANGE " + ctb.SourceBaseDocRevisionId + " " + ctb.NewDocRevisionId; lock (conns) { // Propagate to all provided session keys, except sender herself ManagedConnection senderConn = null; foreach (var x in conns) { if (x.SessionKey == ctb.SourceSessionKey) { senderConn = x; } if (!ctb.ReceiverSessionKeys.Contains(x.SessionKey) || x.SessionKey == ctb.SourceSessionKey) { continue; } tasks.Add(x.WSC.SendAsync(updMsg, CancellationToken.None)); } // Acknowledge change to sender: but only for actual content changes! // We're not acknowledging selection changes, as those don't change revision ID if (senderConn != null && ctb.ChangeJson != null) { tasks.Add(senderConn.WSC.SendAsync(ackMsg, CancellationToken.None)); } } return(Task.WhenAll(tasks)); }