RetryPolicy
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Polly.Retry
{
public class RetryPolicy : Policy, IRetryPolicy, IsPolicy
{
[System.Runtime.CompilerServices.Nullable(1)]
private readonly Action<Exception, TimeSpan, int, Context> _onRetry;
private readonly int _permittedRetryCount;
[System.Runtime.CompilerServices.Nullable(2)]
private readonly IEnumerable<TimeSpan> _sleepDurationsEnumerable;
[System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1,
1
})]
private readonly Func<int, Exception, Context, TimeSpan> _sleepDurationProvider;
[System.Runtime.CompilerServices.NullableContext(1)]
internal RetryPolicy(PolicyBuilder policyBuilder, Action<Exception, TimeSpan, int, Context> onRetry, int permittedRetryCount = int.MaxValue, [System.Runtime.CompilerServices.Nullable(2)] IEnumerable<TimeSpan> sleepDurationsEnumerable = null, [System.Runtime.CompilerServices.Nullable(new byte[] {
2,
1,
1
})] Func<int, Exception, Context, TimeSpan> sleepDurationProvider = null)
: base(policyBuilder)
{
_permittedRetryCount = permittedRetryCount;
_sleepDurationsEnumerable = sleepDurationsEnumerable;
_sleepDurationProvider = sleepDurationProvider;
if (onRetry == null)
throw new ArgumentNullException("onRetry");
_onRetry = onRetry;
}
[System.Runtime.CompilerServices.NullableContext(1)]
protected override TResult Implementation<[System.Runtime.CompilerServices.Nullable(0)] TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken)
{
return RetryEngine.Implementation(action, context, cancellationToken, base.ExceptionPredicates, ResultPredicates<TResult>.None, delegate(DelegateResult<TResult> outcome, TimeSpan timespan, int retryCount, Context ctx) {
_onRetry(outcome.Exception, timespan, retryCount, ctx);
}, _permittedRetryCount, _sleepDurationsEnumerable, (_sleepDurationProvider != null) ? ((Func<int, DelegateResult<TResult>, Context, TimeSpan>)((int retryCount, DelegateResult<TResult> outcome, Context ctx) => _sleepDurationProvider(retryCount, outcome.Exception, ctx))) : null);
}
}
}