การทำงานกับ Thread และดึง Thread ID ใน C#
Thread คือเส้นทางการทำงานของโปรแกรม แต่ละ thread มีการควบคุม flow แยกกัน ใน C# ใช้คลาส System.Threading.Thread สำหรับจัดการ thread
คุณสมบัติสำคัญของ Thread
| คุณสมบัติ | คำอธิบาย |
|---|---|
| ManagedThreadId | ID เฉพาะของ managed thread (int) - ใช้สำหรับระบุตัวตน thread |
| CurrentThread | Static property คืนค่า thread ที่กำลังทำงานอยู่ |
| Name | ชื่อ thread (ตั้งได้ครั้งเดียว) |
| IsAlive | thread กำลังทำงานอยู่หรือไม่ |
| IsBackground | เป็น background thread หรือไม่ |
| ThreadState | สถานะปัจจุบันของ thread |
ตัวอย่าง: ดึง ID ของ Main Thread
using System;
using System.Threading;
class Program
{
public static void Main()
{
Thread currentThread = Thread.CurrentThread;
currentThread.Name = "Main Thread";
Console.WriteLine($"ชื่อ Thread: {currentThread.Name}");
Console.WriteLine($"Managed Thread ID: {currentThread.ManagedThreadId}");
Console.WriteLine($"สถานะ: {currentThread.ThreadState}");
Console.WriteLine($"Is Alive: {currentThread.IsAlive}");
Console.WriteLine($"Is Background: {currentThread.IsBackground}");
}
}
ผลลัพธ์:
ชื่อ Thread: Main Thread Managed Thread ID: 1 สถานะ: Running Is Alive: True Is Background: False
ตัวอย่าง: สร้าง Child Thread และดึง ID
using System;
using System.Threading;
class Program
{
public static void Main()
{
Console.WriteLine($"Main Thread ID: {Thread.CurrentThread.ManagedThreadId}");
Thread childThread = new Thread(DoWork);
childThread.Name = "Worker Thread";
childThread.Start();
// รอให้ child thread ทำงานเสร็จ
childThread.Join();
Console.WriteLine("Child thread จบการทำงานแล้ว");
}
static void DoWork()
{
Console.WriteLine($"Child Thread ID: {Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"Child Thread Name: {Thread.CurrentThread.Name}");
Thread.Sleep(1000); // จำลองงาน
}
}
ผลลัพธ์:
Main Thread ID: 1 Child Thread ID: 4 Child Thread Name: Worker Thread Child thread จบการทำงานแล้ว
Thread ID vs Process ID
- ManagedThreadId - ID ภายใน .NET runtime (managed) เริ่มจาก 1 เพิ่มทีละ 1
- OS Thread ID - ID ของระบบปฏิบัติการ (native) ดึงได้จาก
System.Diagnostics.Process.GetCurrentProcess().Threads - Process ID -
Process.GetCurrentProcess().Idเหมือนกันทุก thread ใน process เดียวกัน
ใน .NET Core / .NET 5+ : Task และ Thread Pool
โค้ดสมัยใหม่มักใช้ Task และ ThreadPool แทนการสร้าง Thread โดยตรง:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine($"Main Thread ID: {Thread.CurrentThread.ManagedThreadId}");
// Task รันบน ThreadPool thread
await Task.Run(() =>
{
Console.WriteLine($"Task Thread ID: {Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"Is ThreadPool: {Thread.CurrentThread.IsThreadPoolThread}");
});
// Parallel.ForEach
Parallel.ForEach(new[] { 1, 2, 3 }, i =>
{
Console.WriteLine($"Parallel Item {i} on Thread: {Thread.CurrentThread.ManagedThreadId}");
});
}
}
สรุป
- ใช้
Thread.CurrentThread.ManagedThreadIdเพื่อดึง ID ของ thread ปัจจุบัน - Main thread มักมี ID = 1
- Thread ID ไม่ได้ recycle ทันที (เพิ่มขึ้นเรื่อยๆ จนถึง int.MaxValue)
- ใน async/await ใช้
Thread.CurrentThread.ManagedThreadIdได้เหมือนกัน แต่อาจสลับ thread ระหว่าง await