AsyncCircuitBreakerPolicy
A circuit-breaker policy that can be applied to async delegates.
using Polly.Utilities;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.CircuitBreaker
{
public class AsyncCircuitBreakerPolicy : AsyncPolicy, ICircuitBreakerPolicy, IsPolicy
{
internal readonly ICircuitController<EmptyStruct> _breakerController;
public CircuitState CircuitState => _breakerController.CircuitState;
public Exception LastException => _breakerController.LastException;
internal AsyncCircuitBreakerPolicy(PolicyBuilder policyBuilder, ICircuitController<EmptyStruct> breakerController)
: base(policyBuilder)
{
_breakerController = breakerController;
}
public void Isolate()
{
_breakerController.Isolate();
}
public void Reset()
{
_breakerController.Reset();
}
protected override async Task<TResult> ImplementationAsync<TResult>(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
{
TResult result = (TResult)default(TResult);
await AsyncCircuitBreakerEngine.ImplementationAsync<EmptyStruct>((Func<Context, CancellationToken, Task<EmptyStruct>>)async delegate(Context ctx, CancellationToken ct) {
result = (TResult)(await action(ctx, ct).ConfigureAwait(continueOnCapturedContext));
return EmptyStruct.Instance;
}, context, cancellationToken, continueOnCapturedContext, base.ExceptionPredicates, ResultPredicates<EmptyStruct>.None, _breakerController).ConfigureAwait(continueOnCapturedContext);
return (TResult)result;
}
}
}