คำตอบทั้งสองไม่ได้กล่าวถึงสิ่งที่รอคอยได้Task.WhenAll
:
var task1 = DoWorkAsync();
var task2 = DoMoreWorkAsync();
await Task.WhenAll(task1, task2);
ความแตกต่างที่สำคัญระหว่างTask.WaitAll
และTask.WhenAll
คือการที่อดีตจะปิดกั้น (คล้ายกับการใช้Wait
ในงานเดียว) ในขณะที่คนหลังจะไม่และสามารถรอได้ให้การควบคุมกลับไปที่ผู้โทรจนกว่างานทั้งหมดจะเสร็จสิ้น
ยิ่งกว่านั้นการจัดการข้อยกเว้นต่างกัน:
Task.WaitAll
:
อย่างน้อยหนึ่งในอินสแตนซ์ของงานถูกยกเลิกหรือมีข้อผิดพลาดเกิดขึ้นระหว่างการดำเนินการของอินสแตนซ์ของงานอย่างน้อยหนึ่งรายการ หากงานถูกยกเลิก AggregateException มี OperationCanceledException ในคอลเล็กชัน InnerExceptions
Task.WhenAll
:
หากงานใด ๆ ที่จัดให้เสร็จสมบูรณ์ในสถานะที่มีความผิดพลาดงานที่ส่งคืนจะเสร็จสมบูรณ์ในสถานะ Faulted โดยที่ข้อยกเว้นจะมีการรวมชุดของข้อยกเว้นที่ยังไม่ได้เปิดจากแต่ละงานที่ให้มา
หากไม่มีงานใดที่ให้มาผิด แต่อย่างน้อยหนึ่งงานถูกยกเลิกงานที่ส่งคืนจะสิ้นสุดในสถานะยกเลิก
หากไม่มีงานใด ๆ ที่ผิดพลาดและไม่มีงานใดถูกยกเลิกงานที่เป็นผลลัพธ์จะสิ้นสุดในสถานะ RanToCompletion หากอาร์เรย์ที่ระบุ / นับไม่ได้งานที่ส่งคืนจะเปลี่ยนเป็นสถานะ RanToCompletion ทันทีก่อนที่จะถูกส่งคืนไปยังผู้โทร
await Task.WhenAll(task1, task2);
หรือไม่?