public void CancellingInputTokenCancelsIssuedToken() { var cts = new CancellationTokenSource(); using var series = new CancellationSeries(); var token = series.CreateNext(cts.Token); Assert.False(token.IsCancellationRequested); cts.Cancel(); Assert.True(token.IsCancellationRequested); }
public void CreateNext_ReturnsCancelledTokenIfInputTokenAlreadyCancelled() { var cts = new CancellationTokenSource(); using (var series = new CancellationSeries()) { cts.Cancel(); var token = series.CreateNext(cts.Token); Assert.True(token.IsCancellationRequested); } }
public void CreateNext_HandlesExceptionsFromPreviousTokenRegistration() { using var series = new CancellationSeries(); var token1 = series.CreateNext(); var exception = new Exception(); token1.Register(() => throw exception); var aggregateException = Assert.Throws <AggregateException>(() => series.CreateNext()); Assert.Same(exception, aggregateException.InnerExceptions.Single()); Assert.True(token1.IsCancellationRequested); }
public void CreateNext_CancelsPreviousToken() { using var series = new CancellationSeries(); var token1 = series.CreateNext(); Assert.False(token1.IsCancellationRequested); var token2 = series.CreateNext(); Assert.True(token1.IsCancellationRequested); Assert.False(token2.IsCancellationRequested); var token3 = series.CreateNext(); Assert.True(token2.IsCancellationRequested); Assert.False(token3.IsCancellationRequested); }
/// <summary> /// Creates an instance of the TaskDelayScheduler. If an originalSourceToken is passed, it will be linked to the PendingUpdateTokenSource so /// that cancelling that token will also flow through and cancel a pending update. /// </summary> public TaskDelayScheduler(TimeSpan taskDelayTime, IProjectThreadingService threadService, CancellationToken originalSourceToken) { _taskDelayTime = taskDelayTime; _threadingService = threadService; _cancellationSeries = new CancellationSeries(originalSourceToken); }