TimeProviderExtensions
Extensions for TimeProvider used by resilience strategies.
using System;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
namespace Polly.Utils
{
internal static class TimeProviderExtensions
{
[System.Runtime.CompilerServices.NullableContext(1)]
public static Task DelayAsync(this TimeProvider timeProvider, TimeSpan delay, ResilienceContext context)
{
Guard.NotNull(timeProvider, "timeProvider");
Guard.NotNull(context, "context");
CancellationToken cancellationToken = context.CancellationToken;
cancellationToken.ThrowIfCancellationRequested();
if (context.IsSynchronous && timeProvider == TimeProvider.System) {
cancellationToken = context.CancellationToken;
if (cancellationToken.CanBeCanceled) {
cancellationToken = context.CancellationToken;
cancellationToken.WaitHandle.WaitOne(delay);
cancellationToken = context.CancellationToken;
cancellationToken.ThrowIfCancellationRequested();
} else
Thread.Sleep(delay);
return Task.CompletedTask;
}
if (context.IsSynchronous) {
timeProvider.Delay(delay, context.CancellationToken).GetAwaiter().GetResult();
return Task.CompletedTask;
}
return timeProvider.Delay(delay, context.CancellationToken);
}
}
}