<PackageReference Include="Polly" Version="8.5.1" />

ConsecutiveCountCircuitController<TResult>

using Polly.Utilities; using System; namespace Polly.CircuitBreaker { internal sealed class ConsecutiveCountCircuitController<TResult> : CircuitStateController<TResult> { private readonly int _exceptionsAllowedBeforeBreaking; private int _consecutiveFailureCount; public ConsecutiveCountCircuitController(int exceptionsAllowedBeforeBreaking, TimeSpan durationOfBreak, Action<DelegateResult<TResult>, CircuitState, TimeSpan, Context> onBreak, Action<Context> onReset, Action onHalfOpen) : base(durationOfBreak, onBreak, onReset, onHalfOpen) { _exceptionsAllowedBeforeBreaking = exceptionsAllowedBeforeBreaking; } public override void OnCircuitReset(Context context) { using (TimedLock.Lock(Lock)) { _consecutiveFailureCount = 0; ResetInternal_NeedsLock(context); } } public override void OnActionSuccess(Context context) { using (TimedLock.Lock(Lock)) { CircuitState internalCircuitState = InternalCircuitState; switch ((int)internalCircuitState) { case 1: case 3: break; case 2: OnCircuitReset(context); break; case 0: _consecutiveFailureCount = 0; break; default: throw new InvalidOperationException("Unhandled CircuitState."); } } } public override void OnActionFailure(DelegateResult<TResult> outcome, Context context) { using (TimedLock.Lock(Lock)) { LastOutcome = outcome; CircuitState internalCircuitState = InternalCircuitState; switch ((int)internalCircuitState) { case 1: case 3: break; case 2: Break_NeedsLock(context); break; case 0: _consecutiveFailureCount++; if (_consecutiveFailureCount >= _exceptionsAllowedBeforeBreaking) Break_NeedsLock(context); break; default: throw new InvalidOperationException("Unhandled CircuitState."); } } } } }