Thread 類別核心 API
| 操作 | 方法/屬性 | 說明 |
| 建立 | new Thread(ThreadStart) | 委派指向無參數無回傳方法 |
| 帶參數建立 | new Thread(ParameterizedThreadStart) | 委派簽章 void(object) |
| 啟動 | Start() / Start(object) | 非同步啟動,立即返回 |
| 暫停(舊) | Suspend() | 已棄用,易造成死結 |
| 恢復(舊) | Resume() | 已棄用 |
| 睡眠 | Sleep(ms) / Sleep(Timeout.Infinite) | 當前執行緒讓出 CPU |
| 中斷睡眠 | Interrupt() | 喚醒目標執行緒,拋 ThreadInterruptedException |
| 等待結束 | Join() / Join(ms) / Join(TimeSpan) | 阻塞呼叫端直到目標結束 |
| 強制終止 | Abort() | 拋 ThreadAbortException,ResetAbort() 可取消 |
| 取消模式 | CancellationToken | 現代優雅取消,協作式 |
基本範例
using System;
using System.Threading;
class Program {
static void Worker() {
for (int i = 0; i < 10; i++) {
Console.WriteLine($"Working {i}");
Thread.Sleep(500);
}
}
static void Main() {
Thread t = new Thread(Worker);
t.Start();
t.Join(3000); // 等待 3 秒
if (t.IsAlive) {
Console.WriteLine("Timeout, aborting...");
t.Abort();
t.Join();
}
Console.WriteLine("Done");
Console.ReadKey();
}
}
暫停/恢復棄用原因與替代方案
// ❌ 危險:Suspend/Resume 可能在持有鎖時暫停,導致死結
// thread.Suspend();
// thread.Resume();
// ✅ 現代模式:CancellationToken
var cts = new CancellationTokenSource();
Thread t = new Thread(() => {
while (!cts.Token.IsCancellationRequested) {
DoWork();
Thread.Sleep(100);
}
});
t.Start();
// 稍後...
cts.Cancel(); // 通知取消
t.Join(); // 等待優雅結束
Thread.Join 詳細行為
Join():無限期等待
Join(ms):等待指定毫秒,超時返回 false
Join(TimeSpan):同上
- 若目標執行緒已結束,立即返回
true
- 死結風險:A Join B,B Join A → 永久阻塞
前景 vs 背景執行緒
| 屬性 | 前景執行緒 | 背景執行緒 |
| 預設 | new Thread(...) | IsBackground = true |
| 進程退出 | 等待所有前景執行緒結束 | 直接終止,不等待 |
| 用途 | 主要業務邏輯 | 輔助工作、監聽、定時器 |
執行緒池:避免頻繁建立銷毀
// 佇列工作項目
ThreadPool.QueueUserWorkItem(_ => {
DoBackgroundWork();
});
// .NET 4+ Task 基礎設施(建議)
Task.Run(() => DoBackgroundWork());
Task.Factory.StartNew(() => DoBackgroundWork(), TaskCreationOptions.LongRunning);
- 執行緒池自動管理工作者執行緒數量
- 適合短時作業;長時間運行用
TaskCreationOptions.LongRunning 建立專用執行緒
同步化原語速查
| 原語 | 用途 | 關鍵方法 |
| lock / Monitor | 互斥鎖 | Enter/Exit, Wait/Pulse |
| Mutex | 跨進程互斥 | WaitOne/ReleaseMutex |
| Semaphore / SemaphoreSlim | 訊號量/限流 | Wait/Release |
| AutoResetEvent / ManualResetEvent | 事件通知 | WaitOne/Set/Reset |
| ReaderWriterLockSlim | 讀寫鎖 | EnterReadLock/EnterWriteLock |
| Interlocked | 原子操作 | Increment/Exchange/CompareExchange |
最佳實踐總結
- 優先使用
Task/async-await 而非手動 Thread
- 取消用
CancellationToken,勿用 Abort/Suspend
- 共享狀態用
lock 或無鎖 Interlocked/Concurrent*
- 背景工作設
IsBackground = true
- 避免
Thread.Sleep 做同步,改用 WaitHandle/Task.Delay