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 การดำเนินการ