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;
        }
    }
}