多執行緒的主要作用
1. 提升效能(Performance)
- 可同時執行多個工作,讓 CPU 利用率提高。
- 避免單一工作阻塞整個應用程式。
2. 改善回應性(Responsiveness)
- UI 程式中,如果長時間任務(例如:下載、運算)不使用背景執行緒,介面會「卡住」或無回應(Not Responding)
- 使用背景執行緒可以保持介面流暢。
3. 支援背景任務
- 比如記錄檔寫入、資料同步、訊息處理等,可以在不打擾主流程的情況下在背景執行。
注意事項
- 多執行緒會有 資源同步 問題(如兩個執行緒同時寫入同一變數),需要使用 lock 或其他同步機制。
- 不當使用可能導致 死結(Deadlock) 或 Race condition。
- 執行緒過多反而會降低效能(執行緒切換成本高)。
實行 多執行緒(Multithreading)的幾種方法
方法 | 是否推薦 | 特點 |
---|---|---|
Thread | ❌ | 基礎、控制度高但效率差 |
ThreadPool | ⚠️ | 簡單但不適合複雜任務追蹤 |
Task / async-await | ✅✅✅ | 現代標準,清晰高效 |
Parallel | ✅ | 適合資料密集工作 |
BackgroundWorker | ❌ | 舊式,不建議 |
Reactive Extensions / Dataflow | ⚙️ | 進階場景、資料流模型 |
1. 使用 Thread 類別(基礎做法)
這是最原始的多執行緒方式,直接建立和啟動執行緒。
Thread t = new Thread(new ThreadStart(MethodName)); t.Start();
✅ 優點:控制度高
❌ 缺點:資源耗費高、不易管理、無法回傳結果
2. 使用 ThreadPool(執行緒池)
用來重複使用系統內的執行緒,減少建立成本。
ThreadPool.QueueUserWorkItem(state => { // 背景工作 });
✅ 較省資源
❌ 難以追蹤完成情況、無回傳值
3. 使用 Task / async-await(現代推薦用法)
是目前主流,較簡潔、支援回傳結果、整合 async/await。
Task.Run(() => { // 執行非同步工作 });
或有回傳值:
Task task = Task.Run(() => { return 42; }); int result = task.Result; // 或 await task;
4. 使用 async / await(非同步程式設計)
這不直接建立執行緒,而是以非同步方式讓系統分配工作。
async Task MyMethodAsync() { await Task.Delay(1000); // 非同步等待,不阻塞執行緒 }
✅ 高可讀性、整合 Task
❌ 需注意執行緒同步與例外處理
5. 使用 Parallel 類別(資料平行化)
可並行執行迴圈、方法,適合處理 CPU-bound 工作。
Parallel.For(0, 10, i => { Console.WriteLine(i); });
✅ 快速、適合大量資料處理
❌ 控制度較低、不適合 I/O-bound 工作
其他補充元件(與多執行緒配合使用):
元件 | 用途與描述 |
---|---|
lock / Monitor |
保護共用資源,避免競爭條件(race condition),適合臨界區控制。 |
Semaphore / Mutex |
控制同時執行的執行緒數量,或用於跨程序資源同步。 |
CancellationToken |
提供中止 `Task`、`Parallel` 等非同步作業的能力,支援取消流程。 |
ConcurrentQueue 等 |
執行緒安全的集合類別,適合在多執行緒環境中安全地共享資料。 |
留言
張貼留言