Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ความแตกต่างระหว่าง Task.WhenAll() และ Task.WaitAll() ใน C#

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 ที่ต้องรอผลลัพธ์