How to cancel a task using a CancellationToken and await Task.WhenAny

CSharp · Console

/Program.cs

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
	public static void Main()
	{
		DoIt().GetAwaiter().GetResult();
	}
	
	public async static Task DoIt() 
	{
		var results = await Task.WhenAll(
			RunTimeLimitedTask(10),
			RunTimeLimitedTask(1000));
		
		foreach(var result in results) Console.WriteLine(result);
	}

	public async static Task<string> RunTimeLimitedTask(int timeLimit)
	{
		var source = new CancellationTokenSource();
		source.CancelAfter(timeLimit);

		try {
			// mimic a web request that will take 500ms
			await Task.Run(async () => await Task.Delay(500, source.Token));
			return "Complete";
		}
		catch (TaskCanceledException) {
			return "Cancelled";
		}
	}
}
;