public async Task <ITransportMessages> ReadCommandAsync(CancellationToken ct)
        {
            var timeoutTask   = Task.Delay(TimeSpan.FromHours(2), ct);
            var readTask      = _protocol.ReadCommandFromStream(_stream, ct);
            var completedTask = await Task.WhenAny(timeoutTask, readTask)
                                .ConfigureAwait(false);

            if (completedTask == timeoutTask)
            {
                return(new CommandTransportMessage()
                {
                    Payload = new TimeoutMessage("Connection timed out")
                });
            }

            //now we know that the amountTask is complete so
            //we can ask for its Result without blocking
            var commandBytes = readTask.Result;

            return(_commandConverter.Deserialize(commandBytes));
        }