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