using System.Threading.Tasks;
static async Task Main(string[] args)
var source = new CancellationTokenSource();
Console.WriteLine("Starting tasks...");
var delayTask = Task.Delay(TimeSpan.FromSeconds(2));
var workTask = SaySomethingAsync(10, source.Token);
Console.WriteLine("Awaiting first task to complete...");
await Task.WhenAny(delayTask, workTask);
if (workTask.IsCompletedSuccessfully)
Console.WriteLine("Completed!");
Console.WriteLine(workTask.Result);
Console.WriteLine("Timed out :-(");
static async Task<string> SaySomethingAsync(int secondsDelay, CancellationToken token)
while (iterations != secondsDelay)
if(token.IsCancellationRequested)
Console.WriteLine($"....{iterations}");
await Task.Delay(TimeSpan.FromSeconds(1));