서로 의존하지 않는 비동기 REST 서비스가 거의 없습니다. 즉, Service1의 응답을 "대기"하는 동안 Service2, Service3 등을 호출 할 수 있습니다.
예를 들어 아래 코드를 참조하십시오.
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
이제 service2Response
의존하지 않으며 service1Response
독립적으로 가져올 수 있습니다. 따라서 두 번째 서비스를 호출하기 위해 첫 번째 서비스의 응답을 기다릴 필요가 없습니다.
Parallel.ForEach
CPU 바인딩 작업이 아니기 때문에 여기서 사용할 수 없다고 생각 합니다.
이 두 연산을 병렬로 호출하기 위해 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
-나는 거기에 논리가 보이지 않습니다. 동시성은 동시성입니다.