private async Task TransmitAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { _txEvent.Wait(cancellationToken); _txEvent.Reset(); NanoMessage nanoMessage; while (_txQueue.TryDequeue(out nanoMessage)) { var nanoMessageBatch = new NanoMessageBatch(); nanoMessageBatch.NanoMessages.Add(nanoMessage); var segments = nanoMessageBatch.Serialize().ToArraySegments(_bufferSize); var tx = 0; for (var i = 0; i < segments.Count; i++) { var segment = segments[i]; await _webSocket.SendAsync(segment, WebSocketMessageType.Binary, i == segments.Count - 1, cancellationToken).ConfigureAwait(false); tx += segment.Count; } Trace.TraceEvent(TraceEventType.Verbose, 1000, () => "Tx {0} bytes", tx.ToString()); TxCount += nanoMessageBatch.NanoMessages.Count; } } }
/// <summary> /// Processes the message asynchronous. /// </summary> /// <param name="bytes">The bytes.</param> /// <param name="cancellationToken"></param> /// <returns></returns> private Task ProcessMessageAsync(byte[] bytes, CancellationToken cancellationToken) { NanoMessageBatch nanoMessageBatch; using (var ms = new MemoryStream(bytes)) { nanoMessageBatch = NanoMessageBatch.Deserialize(ms); } var tasks = new List <Task>(nanoMessageBatch.NanoMessages.Count); tasks.AddRange(nanoMessageBatch.NanoMessages.Select(OnReceivedNanoMessageAsync)); return(TaskHelpers.Iterate(tasks, cancellationToken)); }