Async Task.WhenAll With Timeout
Answer : You could combine the resulting Task with a Task.Delay() using Task.WhenAny() : await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(timeout)); If you want to harvest completed tasks in case of a timeout: var completedResults = tasks .Where(t => t.Status == TaskStatus.RanToCompletion) .Select(t => t.Result) .ToList(); I think a clearer, more robust option that also does exception handling right would be to use Task.WhenAny on each task together with a timeout task, go through all the completed tasks and filter out the timeout ones, and use await Task.WhenAll() instead of Task.Result to gather all the results. Here's a complete working solution: static async Task<TResult[]> WhenAll<TResult>(IEnumerable<Task<TResult>> tasks, TimeSpan timeout) { var timeoutTask = Task.Delay(timeout).ContinueWith(_ => default(TResult)); var completedTasks = (await Task.WhenAll(tasks.Select(task => Task.WhenAny(task, ...