Tôi có một vài dịch vụ REST không đồng bộ không phụ thuộc lẫn nhau. Đó là trong khi "chờ" phản hồi từ Service1, tôi có thể gọi Service2, Service3, v.v.
Ví dụ, tham khảo mã dưới đây:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
Bây giờ, service2Response
không phụ thuộc vào service1Response
và chúng có thể được tìm nạp độc lập. Do đó, tôi không cần phải chờ phản hồi của dịch vụ thứ nhất để gọi dịch vụ thứ hai.
Tôi không nghĩ rằng tôi có thể sử dụng Parallel.ForEach
ở đây vì nó không phải là hoạt động ràng buộc của CPU.
Để gọi hai thao tác này song song, tôi có thể gọi sử dụng Task.WhenAll
không? Một vấn đề tôi thấy khi sử dụng Task.WhenAll
là nó không trả về kết quả. Để tìm nạp kết quả tôi có thể gọi task.Result
sau khi gọi Task.WhenAll
, vì tất cả các tác vụ đã hoàn thành và tất cả những gì tôi cần để tìm phản hồi cho chúng tôi?
Mã mẫu:
var task1 = HttpService1Async();
var task2 = HttpService2Async();
await Task.WhenAll(task1, task2)
var result1 = task1.Result;
var result2 = task2.Result;
// Use result1 and result2
Mã này có tốt hơn mã đầu tiên về hiệu suất không? Bất kỳ phương pháp khác tôi có thể sử dụng?
Parallel.ForEach
sẽ sinh ra các luồng mới trong khi async await
sẽ làm mọi thứ trên một luồng.
await
) trước khi nó sẵn sàng.
WhenAll
trước khi thực hiện Result
với ý tưởng rằng nó hoàn thành tất cả các nhiệm vụ trước .Result được gọi. Vì, Task.Result chặn luồng gọi, tôi cho rằng nếu tôi gọi nó sau khi các tác vụ thực sự hoàn thành thì nó sẽ trả về kết quả ngay lập tức. Tôi muốn xác nhận sự hiểu biết.
I do not think I can use Parallel.ForEach here since it is not CPU bound operation
- Tôi không thấy logic ở đó. Đồng thời là đồng thời.