| 建構子 | 說明 |
|---|---|
Thread(ThreadStart) | 無參數執行緒 |
Thread(ParameterizedThreadStart) | 帶物件參數執行緒 |
| 屬性 | 說明 |
|---|---|
Name | 線程名稱(僅可設定一次,除錯極重要) |
Priority | 優先級 |
IsBackground | 背景線程旗標 |
ThreadState | 當前狀態旗標組合 |
ManagedThreadId | 唯一識別碼(唯讀) |
IsAlive | 是否啟動且未結束 |
IsThreadPoolThread | 是否為線程池線程 |
CurrentCulture/UIculture | 執行緒文化特性 |
| 方法 | 說明 |
|---|---|
Start() | 啟動線程 |
Start(object) | 啟動帶參數線程 |
Join() | 等待結束 |
Sleep(ms) | 靜態方法,讓當前線程睡眠 |
Abort() | 已過時/不建議,強制中止 |
Interrupt() | 喚醒阻塞線程(拋出 ThreadInterruptedException) |
GetDomain() | 取得當前應用程式域 |
GetData/SetData | 線程區域儲存 (TLS) |
using System;
using System.Threading;
class ThreadBasicDemo
{
static void Main()
{
// 無參數
Thread t1 = new Thread(Work);
t1.Name = "Worker-1";
t1.Start();
// 帶參數
Thread t2 = new Thread(WorkWithParam);
t2.Name = "Worker-2";
t2.Start("Hello Parameter");
t1.Join(); t2.Join();
Console.WriteLine("主線程結束");
}
static void Work()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("{0}: {1}", Thread.CurrentThread.Name, i);
Thread.Sleep(100);
}
}
static void WorkWithParam(object param)
{
Console.WriteLine("{0} 收到參數: {1}", Thread.CurrentThread.Name, param);
}
}
避免使用 ParameterizedThreadStart 的 object 裝箱/拆箱,改用 Lambda 捕獲區域變數(強型別、無裝箱):
string msg = "Hello Lambda";
Thread t = new Thread(() => WorkWithString(msg));
t.Start();
void WorkWithString(string s) { Console.WriteLine(s); }
Thread fg = new Thread(() => { Thread.Sleep(1000); Console.WriteLine("前景結束"); });
Thread bg = new Thread(() => { Thread.Sleep(1000); Console.WriteLine("背景結束"); }) { IsBackground = true };
fg.Start(); bg.Start();
// 主線程結束時:前景線程會繼續執行完成,背景線程被強制終止(不印出「背景結束」)
// 設定
Thread.SetData(Thread.GetNamedDataSlot("MySlot"), "Thread-Local Value");
// 取得
string val = (string)Thread.GetData(Thread.GetNamedDataSlot("MySlot"));
.NET 4+ 建議使用 ThreadLocal<T>:
ThreadLocal<string> tls = new ThreadLocal<string>(() => "Initial-" + Thread.CurrentThread.ManagedThreadId);
(原文包含五張圖片,展示 Thread 類別結構、建構子差異、Start/Join 流程、前景背景差異、TLS 概念)