<PackageReference Include="Polly" Version="8.3.0" />

AsyncRetryPolicy<TResult>

public class AsyncRetryPolicy<TResult> : AsyncPolicy<TResult>, IRetryPolicy<TResult>, IRetryPolicy, IsPolicy
using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace Polly.Retry { public class AsyncRetryPolicy<TResult> : AsyncPolicy<TResult>, IRetryPolicy<TResult>, IRetryPolicy, IsPolicy { private readonly Func<DelegateResult<TResult>, TimeSpan, int, Context, Task> _onRetryAsync; private readonly int _permittedRetryCount; private readonly IEnumerable<TimeSpan> _sleepDurationsEnumerable; private readonly Func<int, DelegateResult<TResult>, Context, TimeSpan> _sleepDurationProvider; internal AsyncRetryPolicy(PolicyBuilder<TResult> policyBuilder, Func<DelegateResult<TResult>, TimeSpan, int, Context, Task> onRetryAsync, int permittedRetryCount = int.MaxValue, IEnumerable<TimeSpan> sleepDurationsEnumerable = null, Func<int, DelegateResult<TResult>, Context, TimeSpan> sleepDurationProvider = null) : base(policyBuilder) { _permittedRetryCount = permittedRetryCount; _sleepDurationsEnumerable = sleepDurationsEnumerable; _sleepDurationProvider = sleepDurationProvider; if (onRetryAsync == null) throw new ArgumentNullException("onRetryAsync"); _onRetryAsync = onRetryAsync; } [DebuggerStepThrough] protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext) { return AsyncRetryEngine.ImplementationAsync<TResult>(action, context, cancellationToken, base.ExceptionPredicates, base.ResultPredicates, _onRetryAsync, _permittedRetryCount, _sleepDurationsEnumerable, _sleepDurationProvider, continueOnCapturedContext); } } }