public async Task SendMessagesAsync(IEnumerable <RequestMessage> messages, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken) { Ensure.IsNotNull(messages, "messages"); ThrowIfDisposedOrNotOpen(); var messagesToSend = messages.ToList(); try { if (_listener != null) { _listener.ConnectionBeforeSendingMessages(new ConnectionBeforeSendingMessagesEvent(_connectionId, messagesToSend)); } cancellationToken.ThrowIfCancellationRequested(); using (var buffer = new MultiChunkBuffer(BsonChunkPool.Default)) { using (var stream = new ByteBufferStream(buffer, ownsByteBuffer: false)) { var encoderFactory = new BinaryMessageEncoderFactory(stream, messageEncoderSettings); foreach (var message in messagesToSend) { if (message.ShouldBeSent == null || message.ShouldBeSent()) { var encoder = message.GetEncoder(encoderFactory); encoder.WriteMessage(message); message.WasSent = true; } // Encoding messages includes serializing the // documents, so encoding message could be expensive // and worthy of us honoring cancellation here. cancellationToken.ThrowIfCancellationRequested(); } buffer.Length = (int)stream.Length; } var stopwatch = Stopwatch.StartNew(); var entry = new OutboundQueueEntry(buffer, cancellationToken); _outboundQueue.Enqueue(entry); await entry.Task.ConfigureAwait(false); stopwatch.Stop(); if (_listener != null) { _listener.ConnectionAfterSendingMessages(new ConnectionAfterSendingMessagesEvent(_connectionId, messagesToSend, buffer.Length, stopwatch.Elapsed)); } } } catch (Exception ex) { if (_listener != null) { _listener.ConnectionErrorSendingMessages(new ConnectionErrorSendingMessagesEvent(_connectionId, messagesToSend, ex)); } throw; } }
public async Task SendMessagesAsync(IEnumerable <RequestMessage> messages, MessageEncoderSettings messageEncoderSettings, TimeSpan timeout, CancellationToken cancellationToken) { Ensure.IsNotNull(messages, "messages"); Ensure.IsInfiniteOrGreaterThanOrEqualToZero(timeout, "timeout"); ThrowIfDisposedOrNotOpen(); var messagesToSend = messages.ToList(); try { if (_listener != null) { _listener.ConnectionBeforeSendingMessages(_connectionId, messagesToSend); } using (var buffer = new MultiChunkBuffer(BsonChunkPool.Default)) { using (var stream = new ByteBufferStream(buffer, ownsByteBuffer: false)) { var encoderFactory = new BinaryMessageEncoderFactory(stream, messageEncoderSettings); foreach (var message in messagesToSend) { if (message.ShouldBeSent == null || message.ShouldBeSent()) { var encoder = message.GetEncoder(encoderFactory); encoder.WriteMessage(message); message.WasSent = true; } } buffer.Length = (int)stream.Length; } var stopwatch = Stopwatch.StartNew(); var entry = new OutboundQueueEntry(buffer, cancellationToken); _outboundQueue.Enqueue(entry); await entry.Task.ConfigureAwait(false); stopwatch.Stop(); if (_listener != null) { _listener.ConnectionAfterSendingMessages(_connectionId, messagesToSend, buffer.Length, stopwatch.Elapsed); } } } catch (Exception ex) { if (_listener != null) { _listener.ConnectionErrorSendingMessages(_connectionId, messagesToSend, ex); } throw; } }