Task.WaitAll → Block Thread ปัจจุบัน จนกว่า Task ทั้งหมดจะเสร็จ (Synchronous Blocking)
Task.WhenAll → สร้าง Task ใหม่ที่ Complete เมื่อ Task ทั้งหมดเสร็จ ไม่ Block Thread (Asynchronous Non-blocking)
ตัวอย่าง Task.WhenAll (Non-blocking)
using System;
using System.Threading.Tasks;
namespace DemoApplication
{
class Program
{
static void Main(string[] args)
{
Task task1 = new Task(() =>
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Task 1 - iteration {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); // ไม่ Block
Console.WriteLine("Tasks Completed.");
Console.ReadLine();
}
}
}
Output:
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
เห็นว่า "Tasks Completed." ปรากฎก่อน Task 1 เสร็จ → ไม่ Block
ตัวอย่าง Task.WaitAll (Blocking)
// โค้ดเดียวกัน แต่เปลี่ยนเป็น Task.WaitAll(task1, task2);
Console.WriteLine("Waiting for tasks to complete.");
Task.WaitAll(task1, task2); // Block Thread
Console.WriteLine("Tasks Completed.");
Output:
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.
"Tasks Completed." ปรากฎหลัง Task ทั้งหมดเสร็จ → Block Thread
เมื่อไหร่ควรใช้ตัวไหน?
- Task.WhenAll: ใน Async Method (await Task.WhenAll) UI Thread ไม่ Freeze
- Task.WaitAll: ใน Console App หรือ Background Thread ที่ต้องรอผลลัพธ์