FallbackSyntaxAsync
Fluent API for defining a Fallback Policy.
using Polly.Fallback;
using Polly.Utilities;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Polly
{
public static class FallbackSyntaxAsync
{
public static FallbackPolicy FallbackAsync(this PolicyBuilder policyBuilder, Func<CancellationToken, Task> fallbackAction)
{
if (fallbackAction == null)
throw new ArgumentNullException("fallbackAction");
Func<Exception, Task> onFallbackAsync = (Exception _) => TaskHelper.EmptyTask;
return policyBuilder.FallbackAsync(fallbackAction, onFallbackAsync);
}
public static FallbackPolicy FallbackAsync(this PolicyBuilder policyBuilder, Func<CancellationToken, Task> fallbackAction, Func<Exception, Task> onFallbackAsync)
{
if (fallbackAction == null)
throw new ArgumentNullException("fallbackAction");
if (onFallbackAsync == null)
throw new ArgumentNullException("onFallbackAsync");
return policyBuilder.FallbackAsync(fallbackAction, (Exception outcome, Context context) => onFallbackAsync(outcome));
}
public static FallbackPolicy FallbackAsync(this PolicyBuilder policyBuilder, Func<CancellationToken, Task> fallbackAction, Func<Exception, Context, Task> onFallbackAsync)
{
if (fallbackAction == null)
throw new ArgumentNullException("fallbackAction");
if (onFallbackAsync == null)
throw new ArgumentNullException("onFallbackAsync");
return new FallbackPolicy((Func<Context, CancellationToken, Task> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext) => FallbackEngine.ImplementationAsync(async delegate(Context ctx, CancellationToken ct) {
await action(ctx, ct).ConfigureAwait(continueOnCapturedContext);
return EmptyStruct.Instance;
}, context, policyBuilder.ExceptionPredicates, PredicateHelper<EmptyStruct>.EmptyResultPredicates, (DelegateResult<EmptyStruct> outcome, Context ctx) => onFallbackAsync(outcome.Exception, ctx), async delegate(CancellationToken ct) {
await fallbackAction(ct).ConfigureAwait(continueOnCapturedContext);
return EmptyStruct.Instance;
}, cancellationToken, continueOnCapturedContext), policyBuilder.ExceptionPredicates);
}
}
}