ฉันมีบริการ async REST ไม่กี่รายการซึ่งไม่ได้ขึ้นอยู่กับกันและกัน นั่นคือในขณะที่ "รอ" คำตอบจาก Service1 ฉันสามารถโทร Service2, Service3 และอื่น ๆ
ตัวอย่างเช่นอ้างถึงรหัสด้านล่าง:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
ตอนนี้service2Response
ไม่ได้ขึ้นอยู่กับservice1Response
พวกเขาและสามารถดึงข้อมูลได้อย่างอิสระ ดังนั้นฉันไม่จำเป็นต้องรอการตอบรับจากบริการแรกเพื่อเรียกบริการที่สอง
ฉันไม่คิดว่าฉันสามารถใช้Parallel.ForEach
ที่นี่ได้เนื่องจากไม่ใช่การทำงานของ CPU bound
ในการเรียกการดำเนินการสองอย่างนี้แบบขนานฉันสามารถใช้งานได้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
- ฉันไม่เห็นเหตุผลที่นั่น การเกิดขึ้นพร้อมกันคือการเกิดขึ้นพร้อมกัน