| 方法/屬性 | 說明 |
QueueUserWorkItem(WaitCallback) | 排入無參數工作項目 |
QueueUserWorkItem(WaitCallback, Object) | 排入帶狀態物件的工作項目 |
GetMaxThreads | 取得最大線程數 |
GetMinThreads | 取得最小閒置線程數 |
SetMaxThreads | 設定最大線程數 |
SetMinThreads | 設定最小閒置線程數 |
基本使用範例
using System;
using System.Threading;
class Program
{
static void Main()
{
Console.WriteLine("主線程 ID: {0}", Thread.CurrentThread.ManagedThreadId);
// 簡單排入工作
ThreadPool.QueueUserWorkItem(WorkMethod, "工作項目 1");
ThreadPool.QueueUserWorkItem(WorkMethod, "工作項目 2");
Console.WriteLine("主線程繼續執行...");
Thread.Sleep(1000); // 等待工作完成
Console.WriteLine("主線程結束");
}
static void WorkMethod(object state)
{
Console.WriteLine("執行緒 ID: {0}, 狀態: {1}",
Thread.CurrentThread.ManagedThreadId, state);
Thread.Sleep(500); // 模擬工作
}
}
進階:搭配 WaitHandle 等待完成
using System;
using System.Threading;
class Program
{
static ManualResetEvent[] doneEvents;
static void Main()
{
int taskCount = 5;
doneEvents = new ManualResetEvent[taskCount];
for (int i = 0; i < taskCount; i++)
{
doneEvents[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(WorkMethod, i);
}
WaitHandle.WaitAll(doneEvents);
Console.WriteLine("所有工作完成");
}
static void WorkMethod(object state)
{
int index = (int)state;
Console.WriteLine("任務 {0} 開始,線程 {1}", index, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
Console.WriteLine("任務 {0} 結束", index);
doneEvents[index].Set();
}
}
注意事項
- 線程池線程為背景線程,主程式結束時會強制終止。
- 避免在線程池執行長時間阻塞操作(如同步 I/O、Thread.Sleep 長延遲),會耗盡池資源。
- .NET 4+ 建議使用
Task / Task.Run 取代 ThreadPool,功能更豐富。
- 異常處理:工作項目內的未捕獲異常會導致進程終止,務必在工作方法內 try-catch。
圖示說明
(原文包含四張圖片,展示線程池運作流程、API 結構、範例輸出等)
- 上一篇文章: C# 正則表達式完整參考指南與實戰範例
- 下一篇文章: 多線程入門系列(十):死鎖原理與避免策略
Copyright ©
程式碼之家 All Rights Reserved