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

RetryStateWaitAndRetryForever<TResult>

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