Вы можете запустить все задачи, а затем ждать задачи. Когда все (...) ;
Я не знаю, как это сделать на вашем языке, но выполучить суть:
List<Task<returnType>> tasks = new List<Task<returnType>>();
// start all tasks, don't await for the result yet
for (int i=0; i<idArr.Length; ++i)
{
Task task = callSomeApi(idArr[i]);
tasks.Add(task);
}
// wait until all tasks finished:
await Task.Wait(tasks);
// if desired use Task.Result to use the return value:
foreach(Task<returnType> task in tasks)
{
var result = task.Result;
ProcessResult(result);
}
Если вы не хотите ждать завершения всех задач, но хотите обработать результат, как только одна из задач будет завершена, используйте Task.WhenAny и удалитеГотовое задание из коллекции ожидаемых заданий.Используйте HashSet для быстрого удаления
HashSet<Task<returnType>> tasks = new HashSet<Task<returnType>>();
// start all tasks, don't await for the result:
for (int i=0; i<idArr.Length; ++i)
{
Task<returnType> task = callSomeApi(idArr[i]);
tasks.Add(task);
}
// as long as there are tasks in the HashSet,
// await until any of the tasks in the HashSet is finished:
while(tasks.Any())
{
Task finishedTask = await Task.WhenAny(tasks);
tasks.Remove(finishedTask);
ProcessResult(finishedTask.Result); // only if there is a result
}