將需傳遞給工作項的資料封裝為類別實例,QueueUserWorkItem 以 object 傳遞,執行時轉型取用。此模式避免閉包捕捉變數導致的共享狀態問題。
Interlocked.Increment(ref Count); // 原子遞增
Interlocked.Decrement(ref Count);
Interlocked.Exchange(ref location, value);
Interlocked.CompareExchange(ref location, value, comparand);
lock 開銷ManualResetEvent (初始無訊號)Hashtable 統計、Sleep 2 秒、Interlocked.IncrementeventX.Set() → 主執行緒 WaitOne 解除阻塞
new Timer(TimerCallback callback, object state, int dueTime, int period)
// dueTime: 首次觸發延遲 (ms),Timeout.Infinite 表示不啟動
// period: 間隔 (ms),Timeout.Infinite 表示單次觸發
timer.Change(10000, 2000); // 10秒後重新開始,間隔改為2秒
// 參數為 long,支援 -1 停用
timer.Dispose(); // 停止觸發、釋放資源
timer = null; // 供主執行緒循環判斷結束
| 機制 | 說明 |
|---|---|
| 工作盜演算法 | .NET Core/5+ 採用 work-stealing queue,減少爭用 |
| 執行緒注入/退休 | 依負載動態調整,最小/最大閾值可配置 |
| I/O 完成埠整合 | 非同步 I/O 完成佇列至 ThreadPool |
| 工作項優先級 | 無優先級,FIFO;需優先級請用 Task + 自訂排程器 |
Task.Run 或 Parallel.ForEach| 需求 | 舊 API | 現代 API |
|---|---|---|
| 火後不顧工作 | ThreadPool.QueueUserWorkItem | Task.Run |
| 定時/週期觸發 | System.Threading.Timer | Timer / BackgroundService / Hangfire |
| 非同步等待 | ManualResetEvent | TaskCompletionSource / SemaphoreSlim / Channel |
| 原子計數 | Interlocked | Interlocked (仍為首選) |
| 並行迴圈 | ThreadPool 手動分塊 | Parallel.ForEach / PLINQ |
ThreadPool 以工作盜佇列高效執行大量短任務,Interlocked 提供無鎖原子計數,Timer 實現定時觸發。理解其內部機制(執行緒注入、I/O 整合、回呼執行緒語境)對排查效能問題至關重要。新專案請全面拥抱 Task、async/await、Channels、BackgroundService 現代非同步生態。