using System.Threading.Tasks;
public static async Task Main()
await DoWithTimeout(TimeSpan.FromSeconds(5), c => Task.Delay(TimeSpan.FromSeconds(3), c));
Console.WriteLine("First succeeded");
await DoWithTimeout(TimeSpan.FromSeconds(5), c => Task.Delay(TimeSpan.FromSeconds(6), c));
Console.WriteLine("Second succeeded");
public static async Task DoWithTimeout(TimeSpan timeout, Func<CancellationToken, Task> action)
CancellationTokenSource cts = new CancellationTokenSource(timeout);
var toTask = Task.Delay(timeout, cts.Token);
var winningTask = await Task.WhenAny(toTask, action(cts.Token));
if( winningTask == toTask ) throw new Exception("Timeout!");