publicclassAsyncTimeoutExample { publicasync Task<List<string>> ProcessTasksWithTimeout(IEnumerable<Task<string>> tasks, TimeSpan timeout) { // The key point is the timer task. var timeoutTask = Task.Delay(timeout); var taskList = new List<Task<string>>(tasks) { timeoutTask }; var results = new List<string>();
while (taskList.Count > 0) { Task completedTask = await Task.WhenAny(taskList); // Timed out, stop then return completed results. if (completedTask == timeoutTask) { break; }
taskList.Remove(completedTask); if (completedTask is Task<string> resultTask) { // A task completed in time. // Keep the result and continue until timeout or every tasks are completed. results.Add(await resultTask); } }