using System.Collections.Generic;
using System.Threading.Tasks;
public static void Main()
var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(30));
var tasks = new List<Task> {
StartTask(1, cancellationTokenSource.Token),
StartTask(2, cancellationTokenSource.Token),
StartTask(3, cancellationTokenSource.Token),
StartTask(4, cancellationTokenSource.Token),
StartTask(5, cancellationTokenSource.Token),
StartTask(6, cancellationTokenSource.Token),
StartTask(7, cancellationTokenSource.Token),
StartTask(8, cancellationTokenSource.Token),
StartTask(9, cancellationTokenSource.Token),
StartTask(10, cancellationTokenSource.Token)
cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(9));
var allTasks = new List<Task>(tasks);
var stopAsyncToken = new CancellationTokenSource(TimeSpan.FromSeconds(30)).Token;
Task.WaitAll(allTasks.ToArray(), stopAsyncToken);
private static async Task StartTask(int waitTime, CancellationToken cancellationToken){
await Task.Run(async () => {
await Task.Run(() => Console.WriteLine($"{waitTime}: waiting {waitTime} seconds"));
await Task.Delay(TimeSpan.FromSeconds(waitTime), cancellationToken);
await Task.Run(() => Console.WriteLine($"{waitTime}: waited {waitTime} seconds"));