using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Concurrent;
public static async Task Main()
OnCancelThrowException();
await CancelTaskAndChildren();
private static void OnCancelThrowException()
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Run(() => {
token.ThrowIfCancellationRequested();
token.ThrowIfCancellationRequested();
catch(AggregateException e)
Console.WriteLine("Task Status: {0}, Error Messaage: {1}", task.Status, e.InnerException.Message);
private static void OnCancelReturn() {
var tasks = new List<Task<int>>();
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
int completedIterations = 0;
for(int i=0; i<10; i++) {
tasks.Add(Task.Run(() => {
if(token.IsCancellationRequested)
Interlocked.Increment(ref completedIterations);
if(completedIterations > 5 && !tokenSource.IsCancellationRequested) {
Task.WaitAll(tasks.ToArray());
catch(AggregateException)
Console.WriteLine("{0, 10} {1,20} {2, 14}", "Task Id", "Status", "Iterations");
Console.WriteLine("{0, 10} {1,20} {2, 14:N0}", t.Id, t.Status, t.Status != TaskStatus.Canceled ? t.Result.ToString(): "Not Started");
private static async Task CancelTaskAndChildren()
var tasks = new ConcurrentBag<Task>();
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Task t1 = Task.Run(() => DoSomeWork(1, token), token);
Console.WriteLine($"Task {t1.Id} executing");
Task t2 = Task.Run(() => {
for(int i=3; i<=10; i++) {
t = Task.Factory.StartNew((obj) => DoSomeWork((int)obj, token), i, token);
Console.WriteLine($"Task {t.Id} executing");
Console.WriteLine($"Task {t2.Id} executing");
Console.WriteLine($"Tasks cancellation requested");
await Task.WhenAll(tasks.ToArray());
catch(OperationCanceledException e)
Console.WriteLine(nameof(OperationCanceledException));
foreach(var task in tasks)
Console.WriteLine($"Task {task.Id} {task.Status}");
private static void DoSomeWork(int taskNum, CancellationToken ct)
if(ct.IsCancellationRequested)
Console.WriteLine($"Task {taskNum} was cancelled before it got started");
ct.ThrowIfCancellationRequested();
if(ct.IsCancellationRequested)
Console.WriteLine($"Task {taskNum} cancelled");
ct.ThrowIfCancellationRequested();
Console.WriteLine($"Task {taskNum} completed");