Eu tenho poucos serviços REST assíncronos que não são dependentes um do outro. Ou seja, enquanto "aguarda" uma resposta do Service1, posso chamar Service2, Service3 e assim por diante.
Por exemplo, consulte o código abaixo:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
Agora, service2Response
não depende service1Response
e eles podem ser buscados independentemente. Portanto, não há necessidade de aguardar a resposta do primeiro serviço para chamar o segundo serviço.
Eu não acho que posso usar Parallel.ForEach
aqui, pois não é uma operação vinculada à CPU.
Para chamar essas duas operações em paralelo, posso chamar use Task.WhenAll
? Um problema que vejo usando Task.WhenAll
é que ele não retorna resultados. Para buscar o resultado, posso ligar task.Result
depois de ligar Task.WhenAll
, pois todas as tarefas já estão concluídas e tudo o que preciso para nos buscar uma resposta?
Código de amostra:
var task1 = HttpService1Async();
var task2 = HttpService2Async();
await Task.WhenAll(task1, task2)
var result1 = task1.Result;
var result2 = task2.Result;
// Use result1 and result2
Esse código é melhor que o primeiro em termos de desempenho? Alguma outra abordagem que eu possa usar?
Parallel.ForEach
geraria novos threads, enquanto async await
faria tudo em um único thread.
await
) antes de estar pronta.
WhenAll
antes de Result
concluir a ideia de que ele conclui todas as tarefas antes de .Result ser chamado. Como o Task.Result bloqueia o segmento de chamada, presumo que, se eu chamá-lo após a conclusão das tarefas, retornará o resultado imediatamente. Eu quero validar o entendimento.
I do not think I can use Parallel.ForEach here since it is not CPU bound operation
- Eu não vejo a lógica lá. Simultaneidade é simultaneidade.