首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

.NET 定時任務效能大比拚:Thread.Sleep vs System.Timers.Timer

     編輯:關於ASP.NET

需求:每隔固定間隔 (如 10ms) 執行背景工作。常見兩種寫法:while(true){Thread.Sleep(10);} 與 System.Timers.Timer。本文實測記憶體佔用、執行緒數、Handle 數與實際觸發精度,給出明確選型建議。

測試環境與程式碼

// Thread.Sleep 版
while (true) { Thread.Sleep(10); /* 工作邏輯 */ }

// Timer 版
var timer = new System.Timers.Timer(10);
timer.Elapsed += (s, e) => { /* 工作邏輯 */ };
timer.Start();

測試執行 100,000 次間隔,記錄起迄時間與資源佔用。

實測結果

記憶體與資源佔用

指標Thread.SleepTimer勝出
Work Set (工作集)6.59 MB8.99 MBThread.Sleep
Virtual Bytes (虛擬位元組)104.30 MB114.98 MBThread.Sleep
Page File Bytes (分頁檔)7.14 MB11.44 MBThread.Sleep
Thread Count (執行緒數)34Thread.Sleep
Handle Count95115Thread.Sleep

時間精度 (100,000 次 × 10ms)

指標Thread.SleepTimer
開始時間11:53:37.43211:53:37.416
結束時間12:19:36.71312:19:37.555
實際總耗時~1559 秒~1560 秒
平均間隔~15.59 ms~15.60 ms

深度分析

  1. Thread.Sleep 全面勝利資源佔用:無額外 Timer 執行緒、無 Timer 佇列物件、Handle 數少 20%。
  2. 時間精度兩者皆差:理論 1000 秒 (100,000 × 10ms),實際 ~1560 秒,**誤差 56%**。原因:Thread.Sleep(10) 僅保證「至少睡 10ms」,實際受 OS 排程器影響 (Windows 時脈預設 15.6ms);Timer 同樣受限於執行緒池排程。
  3. Timer 額外開銷:每次觸發需佇列工作項目至 ThreadPool,上下文切換成本較高。

真正的高精度方案

  • Multimedia Timer (timeBeginPeriod/timeSetEvent):P/Invoke `winmm.dll`,可達 1ms 精度,但耗電、影響系統整體排程,慎用。
  • Thread + SpinWait + Stopwatch:忙等待 (Busy Wait) 達微秒級,但佔用 100% CPU 核心,**極不推薦**生產環境。
  • Task.Delay + 高解析度 Stopwatch 校正:.NET 4.5+ 建議模式,配合 `Task.Run` 非阻塞等待。
  • 專用排程庫:Quartz.NET、Hangfire、FluentScheduler,支援 Cron、持久化、叢集、監控,企業級首選。

選型建議決策樹

需要精確到毫秒級、不可漂移? → 是 → 專用排程庫 / Multimedia Timer (極少數場景)
                                                    ↓ 否
單純背景輪詢、容忍 15ms+ 抖動? → 是 → Thread.Sleep 簡單、資源省
                                                    ↓ 否
需支援動態調整間隔、啟停、異常處理? → 是 → System.Timers.Timer / System.Threading.Timer
                                                    ↓ 否
企業級排程 (Cron、持久化、叢集、監控)? → 是 → Quartz.NET / Hangfire

總結

簡單輪詢首選 Thread.Sleep (資源最省);需控制靈活性用 Timer;**任何對精度有要求的場景,請直接使用成熟排程框架**,勿自行造輪子。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved