System.Threading.Thread 是 .NET 建立與控制執行緒的核心類別。本文系統整理其常用方法、關鍵屬性、執行緒狀態機制、優先權設定,並說明 Sleep/Suspend/Join 差異、Abort 風險與最佳實務。
| 方法 | 用途 | 備註 |
|---|---|---|
Start() | 啟動執行緒 | 只能呼叫一次,重複呼叫拋出例外 |
Sleep(ms) | 讓目前執行緒睡眠 | 釋放 CPU、保持鎖、不可被其他執行緒喚醒(除非 Interrupt/Abort) |
Suspend() | 掛起指定執行緒 | 已淘汰:易造成死結(持有鎖時被掛起),.NET 2.0+ 標記 Obsolete |
Resume() | 恢復掛起執行緒 | 配合 Suspend,同樣淘汰 |
Interrupt() | 中斷處於 Wait/Sleep/Join 的執行緒 | 拋出 ThreadInterruptedException,執行緒可捕捉處理 |
Join() | 阻塞呼叫端直到目標執行緒結束 | 可設定逾時毫秒數,傳回 bool 表示是否結束 |
Abort() | 請求終止執行緒 | 極度不建議:拋出 ThreadAbortException、可能損毀資料、無法保證 finally 執行、.NET Core 已移除 |
IsAlive:執行緒已啟動且未正常結束/中止。Name:除錯時極有幫助,建議啟動前設定。Priority:Highest/AboveNormal/Normal/BelowNormal/Lowest,影響 CPU 時間配比,非即時保證。ThreadState:位旗標組合(Running、WaitSleepJoin、Suspended、AbortRequested、Stopped、Background 等)。IsBackground:背景執行緒,主執行緒結束時自動終止,不阻礙程式退出。Unstarted --Start()--> Running --Sleep/Wait/Join--> WaitSleepJoin Running --Suspend() [Obsolete]--> Suspended --Resume()--> Running Running --Abort()--> AbortRequested --(處理中)--> Stopped Running --正常返回--> Stopped
單一執行緒可同時處於多個狀態(如 WaitSleepJoin | AbortRequested)。
Priority 解決同步問題,應使用 lock、Monitor、SemaphoreSlim、Async/Await。ManualResetEventSlim、SemaphoreSlim、CancellationToken 協調執行緒暫停/繼續。CancellationToken,執行緒定期檢查 token.ThrowIfCancellationRequested() 優雅退出。if (!t.Join(5000)) { /* 處理逾時 */ } 避免無限等待。t.IsBackground = true。try/catch 或使用 Task 統一處理。新專案優先考慮:
Task.Run / Task.Factory.StartNew:Thread Pool、支援 await、例外捕捉、取消權杖。Parallel.For/ForEach、PLINQ:資料平行。async/await:I/O 非同步,避免封鎖執行緒。BackgroundService / IHostedService:長期背景工作。理解 Thread 底層運作,有助於除錯舊代碼、效能分析與設計高併發系統,但日常開發請擁抱 Task 與非同步模式。