I am trying to use Task.WhenAll(tasks).Wait(timeout) to wait for tasks to complete and after that process task results.
Consider this example:
var tasks = new List<Task<Foo>>(); tasks.Add(Task.Run(() => GetData1())); tasks.Add(Task.Run(() => GetData2())); Task.WhenAll(tasks).Wait(TimeSpan.FromSeconds(5)); var completedTasks = tasks .Where(t => t.Status == TaskStatus.RanToCompletion) .Select(t => t.Result) .ToList(); // Process completed tasks // ... private Foo GetData1() { Thread.Sleep(TimeSpan.FromSeconds(4)); return new Foo(); } private Foo GetData2() { Thread.Sleep(TimeSpan.FromSeconds(10)); // How can I get the result of this task once it completes? return new Foo(); } It is possible that one of these tasks will not complete their execution within 5 second timeout.
Is it possible to somehow process results of the tasks that have completed after specified timeout? Maybe I am not using right approach in this situation?
EDIT:
I am trying to get all task results that managed to complete within specified timeout. There could be the following outcomes after Task.WhenAll(tasks).Wait(TimeSpan.FromSeconds(5)):
- First task completes within 5 seconds.
- Second task completes within 5 seconds.
- Both tasks complete within 5 seconds.
- None of the tasks complete within 5 seconds. Is it possible to get task results that haven't completed within 5 seconds, but have completed later, lets say, after 10 seconds?
Task.WhenAll(tasks).Wait(TimeSpan.FromSeconds(5));can be simplified toTask.WaitAll(tasks, TimeSpan.FromSeconds(5));to give the same results.