ฉันมีบริการ 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- ฉันไม่เห็นเหตุผลที่นั่น การเกิดขึ้นพร้อมกันคือการเกิดขึ้นพร้อมกัน