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

CircuitBreakerEngine

using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Polly.CircuitBreaker { internal class CircuitBreakerEngine { internal static TResult Implementation<TResult>(Func<TResult> action, Context context, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, ICircuitController<TResult> breakerController) { breakerController.OnActionPreExecute(); try { DelegateResult<TResult> delegateOutcome = (DelegateResult<TResult>)new DelegateResult<TResult>(action()); if (shouldHandleResultPredicates.Any((ResultPredicate<TResult> predicate) => predicate(((DelegateResult<TResult>)delegateOutcome).Result))) breakerController.OnActionFailure((DelegateResult<TResult>)delegateOutcome, context); else breakerController.OnActionSuccess(context); return ((DelegateResult<TResult>)delegateOutcome).Result; } catch (Exception ex2) { Exception ex; Exception ex3 = ex = ex2; if (!shouldHandleExceptionPredicates.Any((ExceptionPredicate predicate) => predicate(ex))) throw; breakerController.OnActionFailure(new DelegateResult<TResult>(ex), context); throw; } } internal static async Task<TResult> ImplementationAsync<TResult>(Func<CancellationToken, Task<TResult>> action, Context context, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, ICircuitController<TResult> breakerController, CancellationToken cancellationToken, bool continueOnCapturedContext) { cancellationToken.ThrowIfCancellationRequested(); breakerController.OnActionPreExecute(); try { <>c__DisplayClass1_0<TResult> <>c__DisplayClass1_; DelegateResult<TResult> delegateOutcome2 = <>c__DisplayClass1_.delegateOutcome; DelegateResult<TResult> delegateOutcome = (DelegateResult<TResult>)new DelegateResult<TResult>(await action(cancellationToken).ConfigureAwait(continueOnCapturedContext)); cancellationToken.ThrowIfCancellationRequested(); if (Enumerable.Any<ResultPredicate<TResult>>(shouldHandleResultPredicates, (Func<ResultPredicate<TResult>, bool>)((ResultPredicate<TResult> predicate) => predicate(((DelegateResult<TResult>)delegateOutcome).Result)))) breakerController.OnActionFailure((DelegateResult<TResult>)delegateOutcome, context); else breakerController.OnActionSuccess(context); return ((DelegateResult<TResult>)delegateOutcome).Result; } catch (Exception ex2) { Exception ex = ex2; if (cancellationToken.IsCancellationRequested) { if (ex is OperationCanceledException && ((OperationCanceledException)ex).CancellationToken == cancellationToken) throw; cancellationToken.ThrowIfCancellationRequested(); } if (!Enumerable.Any<ExceptionPredicate>(shouldHandleExceptionPredicates, (Func<ExceptionPredicate, bool>)((ExceptionPredicate predicate) => predicate(ex)))) throw; breakerController.OnActionFailure(new DelegateResult<TResult>(ex), context); throw; } } } }