Mam kilka asynchronicznych usług REST, które nie są od siebie zależne. To znaczy, „czekając” na odpowiedź Service1, mogę zadzwonić do Service2, Service3 i tak dalej.
Na przykład zapoznaj się z poniższym kodem:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
Teraz service2Response
nie zależy od nich service1Response
i można je pobrać niezależnie. Dlatego nie muszę czekać na odpowiedź pierwszej usługi, aby zadzwonić do drugiej usługi.
Nie sądzę, żebym mógł Parallel.ForEach
tutaj użyć , ponieważ nie jest to operacja związana z procesorem.
Czy mogę wywołać te dwie operacje równolegle, czy mogę wywołać use Task.WhenAll
? Jednym z problemów, z których korzystam, Task.WhenAll
jest to, że nie zwraca wyników. Aby pobrać wynik, czy mogę zadzwonić task.Result
po wywołaniu Task.WhenAll
, ponieważ wszystkie zadania są już zakończone i wystarczy pobrać odpowiedź?
Przykładowy kod:
var task1 = HttpService1Async();
var task2 = HttpService2Async();
await Task.WhenAll(task1, task2)
var result1 = task1.Result;
var result2 = task2.Result;
// Use result1 and result2
Czy ten kod jest lepszy od pierwszego pod względem wydajności? Jakieś inne podejście, którego mogę użyć?
Parallel.ForEach
pojawiłyby się nowe wątki, podczas async await
gdy wszystko robiłoby w jednym wątku.
await
), zanim będzie gotowy.
WhenAll
zanim skończę Result
z pomysłem, że wykona wszystkie zadania przed wywołaniem funkcji .Result. Ponieważ Task.Result blokuje wątek wywołujący, zakładam, że jeśli wywołam go po zakończeniu zadań, natychmiast zwróci wynik. Chcę potwierdzić zrozumienie.
I do not think I can use Parallel.ForEach here since it is not CPU bound operation
- Nie widzę tam logiki. Współbieżność to współbieżność.