Пример #1
0
 // 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;
 }
Пример #2
0
        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);
        }