<PackageReference Include="Polly.Core" Version="8.5.0" />

CancellationTokenSourcePool

using System; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; namespace Polly.Utils { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal abstract class CancellationTokenSourcePool { [System.Runtime.CompilerServices.Nullable(0)] private sealed class DisposableCancellationTokenSourcePool : CancellationTokenSourcePool { private readonly TimeProvider _timeProvider; public DisposableCancellationTokenSourcePool(TimeProvider timeProvider) { _timeProvider = timeProvider; } protected override CancellationTokenSource GetCore(TimeSpan delay) { if (!IsCancellable(delay)) return new CancellationTokenSource(); return _timeProvider.CreateCancellationTokenSource(delay); } public override void Return(CancellationTokenSource source) { source.Dispose(); } } public static CancellationTokenSourcePool Create(TimeProvider timeProvider) { return new DisposableCancellationTokenSourcePool(timeProvider); } public CancellationTokenSource Get(TimeSpan delay) { if (delay <= TimeSpan.Zero && delay != System.Threading.Timeout.InfiniteTimeSpan) throw new ArgumentOutOfRangeException("delay", delay, "Invalid delay specified."); return GetCore(delay); } protected abstract CancellationTokenSource GetCore(TimeSpan delay); public abstract void Return(CancellationTokenSource source); protected static bool IsCancellable(TimeSpan delay) { return delay != System.Threading.Timeout.InfiniteTimeSpan; } } }