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

RetryStateWaitAndRetryWithProvider<TResult>

using Polly.Utilities; using System; using System.Threading; using System.Threading.Tasks; namespace Polly.Retry { internal class RetryStateWaitAndRetryWithProvider<TResult> : IRetryPolicyState<TResult> { private int _errorCount; private readonly int _retryCount; private readonly Func<int, Context, TimeSpan> _sleepDurationProvider; private readonly Action<DelegateResult<TResult>, TimeSpan, int, Context> _onRetry; private readonly Context _context; private readonly Func<DelegateResult<TResult>, TimeSpan, int, Context, Task> _onRetryAsync; public RetryStateWaitAndRetryWithProvider(int retryCount, Func<int, Context, TimeSpan> sleepDurationProvider, Action<DelegateResult<TResult>, TimeSpan, int, Context> onRetry, Context context) { _retryCount = retryCount; _sleepDurationProvider = sleepDurationProvider; _onRetry = onRetry; _context = context; } public bool CanRetry(DelegateResult<TResult> delegateResult, CancellationToken cancellationToken) { _errorCount++; bool num = _errorCount <= _retryCount; if (num) { TimeSpan timeSpan = _sleepDurationProvider(_errorCount, _context); _onRetry(delegateResult, timeSpan, _errorCount, _context); SystemClock.Sleep(timeSpan, cancellationToken); } return num; } public RetryStateWaitAndRetryWithProvider(int retryCount, Func<int, Context, TimeSpan> sleepDurationProvider, Func<DelegateResult<TResult>, TimeSpan, int, Context, Task> onRetryAsync, Context context) { _retryCount = retryCount; _sleepDurationProvider = sleepDurationProvider; _onRetryAsync = onRetryAsync; _context = context; } public async Task<bool> CanRetryAsync(DelegateResult<TResult> delegateResult, CancellationToken cancellationToken, bool continueOnCapturedContext) { this._errorCount++; bool shouldRetry = this._errorCount <= this._retryCount; if (shouldRetry) { TimeSpan waitTimeSpan = this._sleepDurationProvider(this._errorCount, this._context); await this._onRetryAsync(delegateResult, waitTimeSpan, this._errorCount, this._context).ConfigureAwait(continueOnCapturedContext); await SystemClock.SleepAsync(waitTimeSpan, cancellationToken).ConfigureAwait(continueOnCapturedContext); } return shouldRetry; } } }