CancellationTokenSourcePool
using System;
using System.Runtime.CompilerServices;
using System.Threading;
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)
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
if (IsCancellable(delay))
_timeProvider.CancelAfter(cancellationTokenSource, delay);
return cancellationTokenSource;
}
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;
}
}
}