CircuitBreakerEngine
class 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;
}
}
}
}