<PackageReference Include="Polly.Core" Version="8.0.0-alpha.3" />

TimeProvider

abstract class TimeProvider
using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; namespace System { [global::System.Runtime.CompilerServices.NullableContext(1)] [global::System.Runtime.CompilerServices.Nullable(0)] [ExcludeFromCodeCoverage] internal abstract class TimeProvider { [global::System.Runtime.CompilerServices.NullableContext(0)] private sealed class SystemTimeProvider : TimeProvider { internal SystemTimeProvider() { } } private static readonly long MinDateTicks = DateTime.MinValue.Ticks; private static readonly long MaxDateTicks = DateTime.MaxValue.Ticks; public static TimeProvider System { get; } = new SystemTimeProvider(); public virtual TimeZoneInfo LocalTimeZone => TimeZoneInfo.Local; public virtual long TimestampFrequency => Stopwatch.Frequency; public virtual DateTimeOffset GetUtcNow() { return DateTimeOffset.UtcNow; } public DateTimeOffset GetLocalNow() { DateTimeOffset utcNow = GetUtcNow(); TimeZoneInfo localTimeZone = LocalTimeZone; if (localTimeZone == null) throw new InvalidOperationException(); TimeSpan utcOffset = localTimeZone.GetUtcOffset(utcNow); long num = utcNow.Ticks + utcOffset.Ticks; if ((ulong)num > (ulong)MaxDateTicks) num = ((num < MinDateTicks) ? MinDateTicks : MaxDateTicks); return new DateTimeOffset(num, utcOffset); } public virtual long GetTimestamp() { return Stopwatch.GetTimestamp(); } public virtual Task Delay(TimeSpan delay, CancellationToken cancellationToken = default(CancellationToken)) { return Task.Delay(delay, cancellationToken); } public virtual void CancelAfter(CancellationTokenSource source, TimeSpan delay) { source.CancelAfter(delay); } public TimeSpan GetElapsedTime(long startingTimestamp, long endingTimestamp) { long timestampFrequency = TimestampFrequency; if (timestampFrequency <= 0) throw new InvalidOperationException(); return new TimeSpan((long)((double)(endingTimestamp - startingTimestamp) * (10000000 / (double)timestampFrequency))); } public TimeSpan GetElapsedTime(long startingTimestamp) { return GetElapsedTime(startingTimestamp, GetTimestamp()); } } }