internal async ValueTask <T> SendAndReceive_Impl <T>(IRedisCommand command, IResultProcessor <T> resultProcessor, CancellationToken cancellationToken, bool isReconnectionAttempt) { IsBusy = true; Log.Debug($"Executing Command: {command}"); LastCommand = command; Interlocked.Increment(ref _operationsPerformed); try { if (!isReconnectionAttempt) { await _sendAndReceiveSemaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); if (!IsConnected) { await TryConnectAsync(cancellationToken).ConfigureAwait(false); } } await Write(command); LastAction = "Reading Bytes Async"; return(await resultProcessor.Start(this, _pipe)); } catch (Exception innerException) { if (innerException.IsSameOrSubclassOf(typeof(RedisException)) || innerException.IsSameOrSubclassOf(typeof(OperationCanceledException))) { throw; } DisposeNetwork(); IsConnected = false; throw new RedisConnectionException(innerException); } finally { Interlocked.Decrement(ref _outStandingOperations); if (!isReconnectionAttempt) { _sendAndReceiveSemaphoreSlim.Release(); } IsBusy = false; } }