PollingInterval
using System.ClientModel.Primitives;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace System.ClientModel.Internal
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
internal sealed class PollingInterval
{
private static readonly TimeSpan DefaultDelay = TimeSpan.FromSeconds(1);
private readonly TimeSpan _interval;
public PollingInterval(TimeSpan? interval = default(TimeSpan?))
{
_interval = (interval ?? DefaultDelay);
}
[AsyncStateMachine(typeof(<WaitAsync>d__3))]
public Task WaitAsync(PipelineResponse response, CancellationToken cancellationToken)
{
<WaitAsync>d__3 stateMachine = default(<WaitAsync>d__3);
stateMachine.<>t__builder = AsyncTaskMethodBuilder.Create();
stateMachine.<>4__this = this;
stateMachine.response = response;
stateMachine.cancellationToken = cancellationToken;
stateMachine.<>1__state = -1;
stateMachine.<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
public void Wait(PipelineResponse response, CancellationToken cancellationToken)
{
TimeSpan delay = GetDelay(response);
if (!cancellationToken.CanBeCanceled)
Thread.Sleep(delay);
else if (cancellationToken.WaitHandle.WaitOne(delay)) {
cancellationToken.ThrowIfCancellationRequested();
}
}
private TimeSpan GetDelay(PipelineResponse response)
{
if (!PipelineResponseHeaders.TryGetRetryAfter(response, out TimeSpan value) || !(value > _interval))
return _interval;
return value;
}
}
}