public async Task SendMessagesAsync(IEnumerable <RequestMessage> messages, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(messages, nameof(messages));
            ThrowIfDisposedOrNotOpen();

            var helper = new SendMessagesHelper(this, messages, messageEncoderSettings);

            try
            {
                helper.EncodingMessages();
                using (var uncompressedBuffer = helper.EncodeMessages(cancellationToken, out var sentMessages))
                {
                    helper.SendingMessages(uncompressedBuffer);
                    int sentLength;
                    if (AnyMessageNeedsToBeCompressed(sentMessages))
                    {
                        using (var compressedBuffer = CompressMessages(sentMessages, uncompressedBuffer, messageEncoderSettings))
                        {
                            await SendBufferAsync(compressedBuffer, cancellationToken).ConfigureAwait(false);

                            sentLength = compressedBuffer.Length;
                        }
                    }
                    else
                    {
                        await SendBufferAsync(uncompressedBuffer, cancellationToken).ConfigureAwait(false);

                        sentLength = uncompressedBuffer.Length;
                    }
                    helper.SentMessages(sentLength);
                }
            }
            catch (Exception ex)
            {
                helper.FailedSendingMessages(ex);
                throw;
            }
        }
        public void SendMessages(IEnumerable <RequestMessage> messages, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(messages, nameof(messages));
            ThrowIfDisposedOrNotOpen();

            var helper = new SendMessagesHelper(this, messages, messageEncoderSettings);

            try
            {
                helper.EncodingMessages();
                using (var buffer = helper.EncodeMessages(cancellationToken))
                {
                    helper.SendingMessages(buffer);
                    SendBuffer(buffer, cancellationToken);
                    helper.SentMessages(buffer.Length);
                }
            }
            catch (Exception ex)
            {
                helper.FailedSendingMessages(ex);
                throw;
            }
        }
        public async Task SendMessagesAsync(IEnumerable<RequestMessage> messages, MessageEncoderSettings messageEncoderSettings, CancellationToken cancellationToken)
        {
            Ensure.IsNotNull(messages, nameof(messages));
            ThrowIfDisposedOrNotOpen();

            var helper = new SendMessagesHelper(this, messages, messageEncoderSettings);
            try
            {
                helper.EncodingMessages();
                using (var buffer = helper.EncodeMessages(cancellationToken))
                {
                    helper.SendingMessages(buffer);
                    await SendBufferAsync(buffer, cancellationToken).ConfigureAwait(false);
                    helper.SentMessages(buffer.Length);
                }
            }
            catch (Exception ex)
            {
                helper.FailedSendingMessages(ex);
                throw;
            }
        }