RetryResilienceStrategy
using Polly.Telemetry;
using Polly.Utils;
using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
namespace Polly.Retry
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal sealed class RetryResilienceStrategy : ResilienceStrategy
{
private readonly TimeProvider _timeProvider;
private readonly ResilienceStrategyTelemetry _telemetry;
private readonly RandomUtil _randomUtil;
public TimeSpan BaseDelay { get; }
public RetryBackoffType BackoffType { get; }
public int RetryCount { get; }
public PredicateInvoker<ShouldRetryArguments> ShouldRetry { get; }
[System.Runtime.CompilerServices.Nullable(2)]
[field: System.Runtime.CompilerServices.Nullable(2)]
public GeneratorInvoker<RetryDelayArguments, TimeSpan> DelayGenerator {
[System.Runtime.CompilerServices.NullableContext(2)]
get;
}
[System.Runtime.CompilerServices.Nullable(2)]
[field: System.Runtime.CompilerServices.Nullable(2)]
public EventInvoker<OnRetryArguments> OnRetry {
[System.Runtime.CompilerServices.NullableContext(2)]
get;
}
public RetryResilienceStrategy(TimeSpan baseDelay, RetryBackoffType backoffType, int retryCount, PredicateInvoker<ShouldRetryArguments> shouldRetry, [System.Runtime.CompilerServices.Nullable(2)] EventInvoker<OnRetryArguments> onRetry, [System.Runtime.CompilerServices.Nullable(2)] GeneratorInvoker<RetryDelayArguments, TimeSpan> delayGenerator, TimeProvider timeProvider, ResilienceStrategyTelemetry telemetry, RandomUtil randomUtil)
{
BaseDelay = baseDelay;
BackoffType = backoffType;
RetryCount = retryCount;
ShouldRetry = shouldRetry;
OnRetry = onRetry;
DelayGenerator = delayGenerator;
_timeProvider = timeProvider;
_telemetry = telemetry;
_randomUtil = randomUtil;
}
[AsyncStateMachine(typeof(<ExecuteCoreAsync>d__22<, >))]
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
0,
0,
1
})]
protected internal override ValueTask<Outcome<TResult>> ExecuteCoreAsync<[System.Runtime.CompilerServices.Nullable(2)] TResult, [System.Runtime.CompilerServices.Nullable(2)] TState>([System.Runtime.CompilerServices.Nullable(new byte[] {
1,
1,
1,
0,
0,
1
})] Func<ResilienceContext, TState, ValueTask<Outcome<TResult>>> callback, ResilienceContext context, TState state)
{
<ExecuteCoreAsync>d__22<TResult, TState> stateMachine = default(<ExecuteCoreAsync>d__22<TResult, TState>);
stateMachine.<>t__builder = AsyncValueTaskMethodBuilder<Outcome<TResult>>.Create();
stateMachine.<>4__this = this;
stateMachine.callback = callback;
stateMachine.context = context;
stateMachine.state = state;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
private bool IsLastAttempt(int attempt)
{
if (RetryCount == -1)
return false;
return attempt >= RetryCount;
}
}
}