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

Thread-based Parallelism ใน C#: ใช้ Task แทน Thread

ภาพรวม

ใน C# สมัยใหม่ ควรใช้ Task (จาก System.Threading.Tasks) แทนการสร้าง Thread โดยตรง เพราะ Task ใช้ ThreadPool ภายใน มี overhead ต่ำกว่า และรองรับ async/await

วิธีสร้างและเริ่ม Task

1. Task.Run (แนะนำ - เรียบง่ายที่สุด)


using System;
using System.Threading.Tasks;

public class Example {
    public static void Main() {
        Task task = Task.Run(() => {
            int a = 0;
            for (a = 0; a <= 1000; a++) { }
            Console.WriteLine($"{a} loop iterations ends");
        });
        task.Wait(); // รอให้เสร็จ
    }
}

2. Task.Factory.StartNew


Task.Factory.StartNew(() => {
    Console.WriteLine("Welcome!");
});

3. Constructor + Start (สำหรับควบคุมเพิ่มเติม)


Task task = new Task(() => PrintMessage());
task.Start();

ผลลัพธ์


1001 loop iterations ends

แนวทางปฏิบัติที่ดี (Best Practices)

  • ใช้ Task.Run สำหรับ CPU-bound work
  • ใช้ async/await สำหรับ I/O-bound work (ไม่บล็อกเธรด)
  • หลีกเลี่ยง Task.Result และ .Wait() ในโค้ด async (ก่อให้เกิด deadlock)
  • ใช้ Task.WhenAll / Task.WhenAny สำหรับรอหลาย Task
  • ตั้งชื่อ Task ด้วย TaskCreationOptions.LongRunning สำหรับงานที่รันนาน

Task vs Thread

คุณสมบัติThreadTask
OS Threadสร้าง OS thread ใหม่เสมอใช้ ThreadPool (reuse threads)
Overheadสูง (~1MB stack)ต่ำมาก
Return Valueไม่รองรับโดยตรงรองรับ Task<T>
Exception Handlingยากง่ายด้วย await/try-catch
CancellationManualรองรับ CancellationToken