命名空間
using System.Threading;
核心操作對照表
| 操作 | API | 說明 |
| 啟動 | new Thread(ThreadStart).Start() | 非同步加入排程器 |
| 終止 | Abort() (過時) | 拋 ThreadAbortException,不建議使用 |
| 休眠 | Thread.Sleep(ms) | 釋放 CPU 時間片 |
| 優先級 | Thread.Priority = ThreadPriority.Highest | 5 級:Lowest/BelowNormal/Normal/AboveNormal/Highest,OS 不保證遵守 |
| 掛起 | Suspend() (過時) | 危險:可能持有鎖導致死結,已棄用 |
| 恢復 | Resume() (過時) | 配合 Suspend,已棄用 |
| 等待結束 | Join() / Join(timeout) | 阻塞呼叫端直到線程終止 |
| 狀態檢查 | ThreadState、IsAlive | Running/WaitSleepJoin/Suspended/Stopped 等 |
| 前/背景 | IsBackground | true=背景線程,主線程結束自動終止 |
官方範例改良版
using System;
using System.Threading;
public class ThreadExample
{
public static void ThreadProc()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0); // 讓出時間片
}
}
public static void Main()
{
Console.WriteLine("Main: Start second thread.");
Thread t = new Thread(ThreadProc);
t.Start();
// Thread.Sleep(0); // 取消註解觀察調度差異
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Main: Do some work.");
Thread.Sleep(0);
}
Console.WriteLine("Main: Call Join().");
t.Join();
Console.WriteLine("Main: ThreadProc ended. Press Enter.");
Console.ReadLine();
}
}
輸出範例 (非確定性)
Main: Start second thread.
Main: Do some work.
ThreadProc: 0
Main: Do some work.
ThreadProc: 1
Main: Do some work.
ThreadProc: 2
Main: Do some work.
ThreadProc: 3
Main: Call Join().
ThreadProc: 4
ThreadProc: 5
...
ThreadProc: 9
Main: ThreadProc ended. Press Enter.
現代最佳實踐:棄用 API 的替代方案
| 棄用 API | 問題 | 替代方案 |
Abort() | 非預期釋放鎖、損壞狀態 | CancellationToken + 協作式取消 |
Suspend/Resume | 死結風險極高 | Monitor.Wait/Pulse、AutoResetEvent、SemaphoreSlim |
Thread.Priority | OS 不保證、優先級反轉 | 任務式並行 Task、TaskScheduler |
協作式取消範例
var cts = new CancellationTokenSource();
Thread t = new Thread(() =>
{
while (!cts.Token.IsCancellationRequested)
{
// 工作邏輯
Thread.Sleep(100);
}
Console.WriteLine("Thread exited gracefully.");
});
t.Start();
// 別處需停止時
cts.Cancel();
t.Join(); // 等待優雅退出
Thread vs Task 選擇指南
- 需要專用線程身分 (STA、特定名稱、長生命週期、COM 互通) →
Thread
- 計算密集/IO 密集並行、需異常傳播、支援 await、取消、續作 →
Task / Task.Run
- 資料並行迴圈 →
Parallel.For/ForEach
- 非阻塞非同步 IO →
async/await