То, что вы описываете, кажется очень распространенным требованием, однако я нигде не мог найти пример этого. И я много искал ... Я наконец-то создал следующее:
TimeSpan timeout = TimeSpan.FromSeconds(5.0);
Task<Task>[] tasksOfTasks =
{
Task.WhenAny(SomeTaskAsync("a"), Task.Delay(timeout)),
Task.WhenAny(SomeTaskAsync("b"), Task.Delay(timeout)),
Task.WhenAny(SomeTaskAsync("c"), Task.Delay(timeout))
};
Task[] completedTasks = await Task.WhenAll(tasksOfTasks);
List<MyResult> = completedTasks.OfType<Task<MyResult>>().Select(task => task.Result).ToList();
Я предполагаю, что здесь метод SomeTaskAsync, который возвращает задачу .
Из числа выполненных задач, только задачи типа MyResult являются нашими собственными задачами, которым удалось побить время. Task.Delay возвращает другой тип.
Это требует некоторого компромисса при наборе текста, но все равно работает красиво и довольно просто.
(Конечно, массив можно построить динамически, используя запрос + ToArray).
- Обратите внимание, что для этой реализации не требуется SomeTaskAsync для получения токена отмены.