using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace CSharpUtil.Extensions.Tasks { public static class TaskWaitingExtensions { public static async Task WaitAsync(this Task task, TimeSpan timeout) { using (var timeoutCancellationTokenSource = new CancellationTokenSource()) { var delayTask = Task.Delay(timeout, timeoutCancellationTokenSource.Token); if (await Task.WhenAny(task, delayTask) == task) { timeoutCancellationTokenSource.Cancel(); return await task; } throw new TimeoutException("The operation has timed out."); } } public static async Task WaitAsync(this Task task, TimeSpan timeout) { using (var timeoutCancellationTokenSource = new CancellationTokenSource()) { var delayTask = Task.Delay(timeout, timeoutCancellationTokenSource.Token); if (await Task.WhenAny(task, delayTask) == task) { timeoutCancellationTokenSource.Cancel(); return; } throw new TimeoutException("The operation has timed out."); } } } }