У меня есть несколько асинхронных служб REST, которые не зависят друг от друга. То есть, пока «ожидая» ответа от Service1, я могу позвонить в Service2, Service3 и так далее.
Например, смотрите ниже код:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
Теперь service2Response
не зависит, service1Response
и они могут быть получены независимо. Следовательно, мне не нужно ждать ответа первой службы для вызова второй службы.
Я не думаю, что я могу использовать Parallel.ForEach
здесь, поскольку это не связано с процессором операции.
Можно ли вызвать эти две операции параллельно, могу ли я вызвать use Task.WhenAll
? Одна проблема, которую я вижу, Task.WhenAll
это то, что она не возвращает результаты. Чтобы получить результат, я могу позвонить task.Result
после вызова Task.WhenAll
, так как все задачи уже выполнены, и все, что мне нужно, чтобы получить нам ответ?
Образец кода:
var task1 = HttpService1Async();
var task2 = HttpService2Async();
await Task.WhenAll(task1, task2)
var result1 = task1.Result;
var result2 = task2.Result;
// Use result1 and result2
Этот код лучше, чем первый, с точки зрения производительности? Любой другой подход, который я могу использовать?
Parallel.ForEach
будут порождаться новые потоки, тогда как async await
все будет выполняться в одном потоке.
await
), прежде чем он будет готов.
WhenAll
перед тем, как делаю Result
мысль, что он завершает все задачи перед вызовом .Result. Поскольку Task.Result блокирует вызывающий поток, я предполагаю, что если я вызову его после фактического завершения задач, он немедленно вернет результат. Я хочу подтвердить понимание.
I do not think I can use Parallel.ForEach here since it is not CPU bound operation
- Я не вижу логики там. Параллелизм - это параллелизм.