У меня есть несколько похожих задач, каждая из которых ограничена тайм-аутом, то есть должна быть выполнена быстрее указанного времени или вернуть пустой результат.Основная цель этих задач - получение ответа от сервера с ограничением времени ожидания.Ниже приведен пример такой задачи:
public async Task<List<Data>> GetDataWithTimeoutAsync(InputData data, int timeout)
{
List<Data> resultData = new List<Data>;
await Task.WhenAny(Task.Run(async () =>
{
resultData.Add(SomeWork(data));
}),
Task.Delay(timeout));
return resultData;
}
Каждая из этих задач работает правильно отдельно.
Но я хочу запустить некоторые из таких задач параллельно.Для этого я использую следующий код:
public async Task<List<List<Data>>> GetAllDataAsync()
{
var resultTasks = new ConcurrentBag<Task<List<Data>>>();
var firtsTask = GetDataWithTimeoutAsync(firstInputData, firtsTimeout);
var secondTask = GetDataWithTimeoutAsync(secondInputData, secondTimeout);
var thirdTask = GetDataWithTimeoutAsync(thirdInputData, thirdTimeout);
resultTasks.Add(Task.Run(() => firtsTask));
resultTasks.Add(Task.Run(() => secondTask));
resultTasks.Add(Task.Run(() => thirdTask));
await Task.WhenAll(resultTasks);
var result = resultTasks.Select(t => t.Result).ToList();
return result;
}
Но этот код работает неправильно, если для вложенных задач установлены разные таймауты.В этом случае все задачи завершаются после наименьшего времени ожидания.
Как я могу запускать некоторые задачи параллельно с WhenAll, если каждая задача является результатом WhenAny?