首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 線程定時器 vs while(true) 循環:性能與適用場景深度對比

     編輯:程式設計綜合問答

核心結論

System.Threading.Timer(或 Task.Delay)優於 while(true)+Thread.Sleep,除非極少數需精確控制執行間隔、無等待唤醒機制的場景。

對比表

維度Timer / Task.Delaywhile(true) + Sleep
CPU 佔用極低(內核定時器/IOCP 排隊)Sleep 期間為 0,但醒來/休眠切換有開銷
精確度毫秒級(受線程池調度影響)同樣受調度影響,易產生累積誤差
異常處理回調內 try-catch,不影響下次觸發需手動 try-catch 包裹循環體,否則線程死掉
取消/暫停timer.Change(Timeout.Infinite, ...) / CancellationToken需共享 volatile bool 标志位,配合 Sleep 檢查
資源釋放Dispose() 釋放內核對象線程結束需 Join(),否則殭屍線程
適用場景定時任務、輪詢、延遲執行極簡輪詢、無線程池環境、需緊湊控制邏輯

現代最佳實踐

// .NET 6+ 周期性任務
var cts = new CancellationTokenSource();
var task = Task.Run(async () => {
    while (!cts.Token.IsCancellationRequested) {
        await DoWorkAsync();
        try { await Task.Delay(TimeSpan.FromSeconds(30), cts.Token); }
        catch (OperationCanceledException) { break; }
    }
}, cts.Token);

// 停止
cts.Cancel();
await task;

何時考慮 while(true)

  • 嵌入式/無標準庫環境(如 FreeRTOS 任務)。
  • 需在循環內同步等待多個異步事件(WaitHandle.WaitAny)。
  • 極高頻(<1ms)忙等待,但通常改用 SpinWait 或專用定時器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved