// No locks as we expect this class to be used linearly. // If another CancellationTokenSource is created, we might have a CancellationToken outstanding // that isn't cancelled if _cts.Cancel() is called. This happens only on the Abort paths, so it's not an issue. private void InitializeCancellationToken(TimeSpan timeout) { if (timeout == TimeSpan.MaxValue || timeout == Timeout.InfiniteTimeSpan) { _cancellationToken = CancellationToken.None; } else if (timeout > TimeSpan.Zero) { _cts = new CancellationTokenSource(); _cancellationToken = _cts.Token; TimeoutTokenSource.FromTimeout((int)timeout.TotalMilliseconds).Register(s_cancelOnTimeout, this); } else { _cancellationToken = new CancellationToken(true); } _cancellationTokenInitialized = true; }
public async Task <CancellationToken> GetCancellationTokenAsync() { if (!_cancellationTokenInitialized) { var timeout = RemainingTime(); if (timeout >= MaxWait || timeout == Timeout.InfiniteTimeSpan) { _cancellationToken = CancellationToken.None; } else if (timeout > TimeSpan.Zero) { _cancellationToken = await TimeoutTokenSource.FromTimeoutAsync((int)timeout.TotalMilliseconds); } else { _cancellationToken = s_precancelledToken; } _cancellationTokenInitialized = true; } return(_cancellationToken); }