.NET 線程狀態由 System.Threading.ThreadState 旗標列舉表示,可組合多重狀態。
| 狀態 | 數值 | 說明 |
|---|---|---|
Unstarted | 0 | 建立但未呼叫 Start() |
Running | 0 | 正在執行(實際無此旗標,Running = 0 且非其他狀態) |
WaitSleepJoin | 1 | 阻塞於 Wait/Sleep/Join |
SuspendRequested | 2 | 請求暫停(已過時) |
Suspended | 4 | 已暫停(已過時) |
AbortRequested | 128 | 請求中止 |
Aborted | 256 | 已中止 |
Stopped | 16 | 正常結束 |
Background | 4 | 背景線程旗標(可組合) |
建立 Thread 實例
↓
[Unstarted]
↓ Start()
[Running] ←→ [WaitSleepJoin] (Sleep/Wait/Join)
↓ ↑
[AbortRequested] │ (喚醒/超時)
↓ │
[Aborted] │
↓ │
[Stopped] ←────────────────┘
↑
(正常返回/拋出未捕獲異常)
using System;
using System.Threading;
class ThreadStateDemo
{
static void Main()
{
Thread t = new Thread(Work);
PrintState("建立後", t);
t.Start();
Thread.Sleep(50); // 確保啟動
PrintState("Start 後", t);
t.Join();
PrintState("Join 後", t);
}
static void Work()
{
Thread.Sleep(1000); // 進入 WaitSleepJoin
}
static void PrintState(string label, Thread t)
{
Console.WriteLine("{0}: {1} (值={2})", label, t.ThreadState, (int)t.ThreadState);
// 解析組合旗標
if ((t.ThreadState & ThreadState.Background) != 0)
Console.WriteLine(" -> 背景線程");
}
}
| 操作 | 來源狀態 | 目標狀態 | 備註 |
|---|---|---|---|
Start() | Unstarted | Running | 只能呼叫一次 |
Sleep() | Running | WaitSleepJoin | 釋放 CPU,保留鎖 |
Wait() | Running (持有鎖) | WaitSleepJoin | 釋放鎖並等待 |
Join() | Running | WaitSleepJoin | 等待目標線程結束 |
Abort() | 任意 | AbortRequested → Aborted → Stopped | 引發 ThreadAbortException,不建議使用 |
| 正常返回 | Running | Stopped | 執行緒函數結束 |
| 未捕獲異常 | Running | Stopped | 進程可能終止(.NET 2.0+) |
t.IsBackground = true。所有前景線程結束時,進程強制終止背景線程(不執行 finally/finalizer)。Suspend()/Resume() 已標記 [Obsolete],極易造成死鎖(暫停時可能持有鎖),嚴禁使用。
(原文包含兩張圖片,展示 ThreadState 旗標組合邏輯、狀態轉換狀態機圖)