ใน C# คลาส Thread (ใน System.Threading) มี property ThreadState ที่คืนค่าสถานะปัจจุบันของเธรดเป็น enum ThreadState ซึ่งเป็น flags (สามารถรวมสถานะได้หลายค่า) สถานะหลักได้แก่ Unstarted, Running, WaitSleepJoin, Suspended, Aborted, Stopped ฯลฯ
ตัวอย่างโค้ดที่ 1: เธรดที่ยังไม่เริ่ม
using System;
using System.Threading;
public class Demo
{
public static void Main()
{
Thread thread = new Thread(new ThreadStart(Demo1));
ThreadPool.QueueUserWorkItem(new WaitCallback(Demo2));
Console.WriteLine("Current state of Thread = " + thread.ThreadState);
Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
}
public static void Demo1()
{
Thread.Sleep(2000);
}
public static void Demo2(object stateInfo)
{
Console.WriteLine("Thread belongs to managed thread pool? = " + Thread.CurrentThread.IsThreadPoolThread);
}
}
ผลลัพธ์
Current state of Thread = Unstarted
ManagedThreadId = 3
ตัวอย่างโค้ดที่ 2: เธรดเริ่มทำงานแล้ว
using System;
using System.Threading;
public class Demo
{
public static void Main()
{
Thread thread = new Thread(new ThreadStart(Demo));
Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);
Console.WriteLine("Current state of Thread = " + thread.ThreadState);
thread.Start();
Console.WriteLine("Current state of Thread = " + thread.ThreadState);
}
public static void Demo()
{
Console.WriteLine("Thread belongs to managed thread pool? = " + Thread.CurrentThread.IsThreadPoolThread);
}
}
ผลลัพธ์
ManagedThreadId = 3
Current state of Thread = Unstarted
Thread belongs to managed thread pool? = False
Current state of Thread = Running
ค่า ThreadState ที่พบบ่อย
| ค่า | คำอธิบาย |
|---|---|
Unstarted | เธรดถูกสร้างแต่ยังไม่ได้เรียก Start() |
Running | เธรดกำลังทำงานอยู่ |
WaitSleepJoin | เธรดรอ (Wait, Sleep, Join) |
Suspended | เธรดถูกระงับ (Deprecated) |
AbortRequested | มีการขอ Abort |
Stopped | เธรดสิ้นสุดการทำงานแล้ว |
Background | เป็น Background thread |
ข้อสังเกตสำคัญ
ThreadStateเป็น bitwise flags - อาจมีหลายสถานะพร้อมกัน (เช่นRunning | Background)- ใช้
(thread.ThreadState & ThreadState.Running) != 0เพื่อตรวจสอบ flag เฉพาะ ManagedThreadIdเป็น ID เฉพาะของเธรดใน managed environmentIsThreadPoolThreadบอกว่าเป็น thread pool thread หรือไม่- หลีกเลี่ยงการใช้ Thread.Abort(), Thread.Suspend(), Thread.Resume() - Deprecated และอันตราย
แนวทางสมัยใหม่ (Modern Approach)
ใน .NET สมัยใหม่ ควรใช้:
TaskและTask<T>แทน Thread โดยตรงasync/awaitสำหรับ asynchronous programmingThreadPool.QueueUserWorkItemหรือTask.Run()สำหรับงานพื้นหลังCancellationTokenสำหรับการยกเลิกงาน แทน Thread.Abort()