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, DelegateResult<TResult>, 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, DelegateResult<TResult>, 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, delegateResult, _context);
_onRetry(delegateResult, timeSpan, _errorCount, _context);
SystemClock.Sleep(timeSpan, cancellationToken);
}
return num;
}
public RetryStateWaitAndRetryWithProvider(int retryCount, Func<int, DelegateResult<TResult>, 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, delegateResult, this._context);
await this._onRetryAsync(delegateResult, waitTimeSpan, this._errorCount, this._context).ConfigureAwait(continueOnCapturedContext);
await SystemClock.SleepAsync(waitTimeSpan, cancellationToken).ConfigureAwait(continueOnCapturedContext);
}
return shouldRetry;
}
}
}