Как указано в комментариях, я бы предположил, что вы можете использовать Task.WhenAll()
, чтобы определить все задачи для завершения и получить результаты с помощью return await Task.WhenAll(tasks);
.Для этого вы можете обновить свой код, как показано ниже.
public async Task<IEnumerable<Route>> GetRoutes(IEnumerable<Coordinates> origns, IEnumerable<Coordinates> destinations)
{
ConcurrentBag<Route> routes = new ConcurrentBag<Route>();
List<Task> tasks = new List<Task>();
foreach (var origin in origns)
{
foreach (var destination in destinations)
{
tasks.Add(_routeService.GetRoute(origin, destination));
}
}
var response = await Task.WhenAll(tasks);
foreach (var item in response)
{
routes.Add(item);
}
return routes;
}
}
Поскольку все вызовы будут возвращать один и тот же тип, вам не нужно начинать секунду foreach
в другом цикле.Кроме того, таким образом вы избежите блокировки выполнения потока с помощью Task.WaitAll()
, и ваша программа будет работать более синхронно.Чтобы увидеть разницу между WhenAll()
против WaitAll()
, вы можете проверить this out.