public void TestShutdown() { var cancellationTokenSource = new CancellationTokenSource(); var pipeLine = new PipeLine(cancellationTokenSource); //post failure in 2 seconds. //It would be the same if was signal from inside block 2 Task.Factory.StartNew(async() => { await Task.Delay(2000); Console.WriteLine("Time to shutdown the pipeline!"); cancellationTokenSource.Cancel(); }); //send requests to pipe in background for 5 seconds Task.Run(async() => { for (int i = 1; i < 100; i++) { if (cancellationTokenSource.IsCancellationRequested) { break; } Thread.Sleep(50); //to see pipe closing input pipeLine.submitToPipe(i); } pipeLine.Complete(); }); pipeLine.waifForCompletetion(); }