Task.WaitAll บล็อกเธรดปัจจุบันจนกว่างานอื่น ๆ ทั้งหมดจะเสร็จสิ้นการดำเนินการ เมธอด Task.WhenAll ถูกใช้เพื่อสร้างงานที่จะเสร็จสมบูรณ์ ifand ก็ต่อเมื่องานอื่น ๆ ทั้งหมดเสร็จสิ้นแล้ว
หากเราใช้ Task.WhenAll เราจะได้รับวัตถุงานที่ไม่สมบูรณ์ อย่างไรก็ตาม มันจะไม่บล็อก แต่จะอนุญาตให้โปรแกรมดำเนินการ ในทางกลับกัน การเรียกเมธอด theTask.WaitAll จะบล็อกและรอให้งานอื่นทั้งหมดเสร็จสิ้น
เพื่อทำความเข้าใจกับตัวอย่าง สมมติว่าเรามีงานที่ดำเนินการบางอย่างกับเธรด UI ที่บอกว่าแอนิเมชั่นบางรายการต้องแสดงในส่วนต่อประสานผู้ใช้ ตอนนี้ หากเราใช้ Task.WaitAll ส่วนต่อประสานผู้ใช้จะถูกบล็อกและจะไม่ได้รับการอัปเดตจนกว่างานที่เกี่ยวข้องทั้งหมดจะเสร็จสมบูรณ์และบล็อกถูกปล่อย อย่างไรก็ตาม หากเราใช้ Task.WhenAll ในแอปพลิเคชันเดียวกัน เธรด UI จะไม่ถูกบล็อกและจะได้รับการอัปเดตตามปกติ
ตัวอย่างสำหรับ Task.WhenAll −
ตัวอย่าง
using System; using System.Threading.Tasks; namespace DemoApplication{ public class Program{ static void Main(string[] args){ Task task1 = new Task(() =>{ for (int i = 0; i < 5; i++){ Console.WriteLine("Task 1 - iteration {0}", i); Task.Delay(1000); } Console.WriteLine("Task 1 complete"); }); Task task2 = new Task(() =>{ Console.WriteLine("Task 2 complete"); }); task1.Start(); task2.Start(); Console.WriteLine("Waiting for tasks to complete."); Task.WhenAll(task1, task2); Console.WriteLine("Tasks Completed."); Console.ReadLine(); } } }
ผลลัพธ์
ผลลัพธ์ของโค้ดด้านบนคือ
Waiting for tasks to complete. Tasks Completed. Task 1 - iteration 0 Task 2 complete Task 1 - iteration 1 Task 1 - iteration 2 Task 1 - iteration 3 Task 1 - iteration 4 Task 1 complete
ในตัวอย่างข้างต้น เราจะเห็นว่าเมื่อใช้ Task.WhenAll งานเสร็จสมบูรณ์ก่อนอื่นงานจะเสร็จสมบูรณ์ ซึ่งหมายความว่า Task.WhenAll ไม่บล็อกการดำเนินการ
ตัวอย่างสำหรับ Task.WaitAll −
ตัวอย่าง
using System; using System.Threading.Tasks; namespace DemoApplication{ public class Program{ static void Main(string[] args){ Task task1 = new Task(() =>{ for (int i = 0; i < 5; i++){ Console.WriteLine("Task 1 - iteration {0}", i); Task.Delay(1000); } Console.WriteLine("Task 1 complete"); }); Task task2 = new Task(() =>{ Console.WriteLine("Task 2 complete"); }); task1.Start(); task2.Start(); Console.WriteLine("Waiting for tasks to complete."); Task.WaitAll(task1, task2); Console.WriteLine("Tasks Completed."); Console.ReadLine(); } } }
ผลลัพธ์
ผลลัพธ์ของโค้ดด้านบนคือ
Waiting for tasks to complete. Task 1 - iteration 0 Task 2 complete Task 1 - iteration 1 Task 1 - iteration 2 Task 1 - iteration 3 Task 1 - iteration 4 Task 1 complete Tasks Completed.
ในตัวอย่างข้างต้น เราจะเห็นว่าเมื่อใช้ Task.WaitAll งานเสร็จสมบูรณ์จะดำเนินการหลังจากงานอื่น ๆ ทั้งหมดเสร็จสิ้นเท่านั้น ซึ่งหมายความว่า Task.WaitAllblock การดำเนินการ