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

CircuitBreakerEngine

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.ExceptionServices; using System.Threading; using System.Threading.Tasks; namespace Polly.CircuitBreaker { internal class CircuitBreakerEngine { internal static TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken, IEnumerable<ExceptionPredicate> shouldHandleExceptionPredicates, IEnumerable<ResultPredicate<TResult>> shouldHandleResultPredicates, ICircuitController<TResult> breakerController) { cancellationToken.ThrowIfCancellationRequested(); breakerController.OnActionPreExecute(); try { TResult result = (TResult)action(context, cancellationToken); if (shouldHandleResultPredicates.Any((ResultPredicate<TResult> predicate) => predicate((TResult)result))) breakerController.OnActionFailure(new DelegateResult<TResult>((TResult)result), context); else breakerController.OnActionSuccess(context); return (TResult)result; } catch (Exception ex2) { Exception ex; Exception ex3 = ex = ex2; Exception ex4 = (from predicate in shouldHandleExceptionPredicates select predicate(ex)).FirstOrDefault((Exception e) => e != null); if (ex4 == null) throw; breakerController.OnActionFailure(new DelegateResult<TResult>(ex4), context); if (ex4 != ex) ExceptionDispatchInfo.Capture(ex4).Throw(); throw; } } internal static async Task<TResult> ImplementationAsync<TResult>(Func<Context, 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 { TResult result = (TResult)(await action(context, cancellationToken).ConfigureAwait(continueOnCapturedContext)); if (Enumerable.Any<ResultPredicate<TResult>>(shouldHandleResultPredicates, (Func<ResultPredicate<TResult>, bool>)((ResultPredicate<TResult> predicate) => predicate((TResult)result)))) breakerController.OnActionFailure(new DelegateResult<TResult>((TResult)result), context); else breakerController.OnActionSuccess(context); return (TResult)result; } catch (Exception ex2) { Exception ex = ex2; Exception ex3 = Enumerable.FirstOrDefault<Exception>(Enumerable.Select<ExceptionPredicate, Exception>(shouldHandleExceptionPredicates, (Func<ExceptionPredicate, Exception>)((ExceptionPredicate predicate) => predicate(ex))), (Func<Exception, bool>)((Exception e) => e != null)); if (ex3 == null) throw; breakerController.OnActionFailure(new DelegateResult<TResult>(ex3), context); if (ex3 != ex) ExceptionDispatchInfo.Capture(ex3).Throw(); throw; } } } }