<PackageReference Include="Polly" Version="8.0.0-beta.2" />

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); } } }