.net 6中新增了一個異步計時器PeriodicTimer,相對普通Timer的回調, 它的模型更簡單。
1 var second = TimeSpan.FromSeconds(3); 2 using var timer = new PeriodicTimer(second); 3 4 while (await timer.WaitForNextTickAsync()) 5 { 6 Console.WriteLine($"Tick {DateTime.Now}"); 7 }
關於WaitForNextTickAsync的處理策略,MSDN有點語焉不詳,我以前面代碼中這個周期為3s的Timer為例,簡單測了下:
1. 執行時間小於Timer周期:
將每個任務執行時間調整到2s,查看輸出
Tick 2022/1/7 11:30:58
Tick 2022/1/7 11:31:01
Tick 2022/1/7 11:31:04
2. 執行周期大於Timer周期:
將每個任務執行時間調整到5s,查看輸出:
Tick 2022/1/7 11:33:08
Tick 2022/1/7 11:33:13
Tick 2022/1/7 11:33:18
Tick 2022/1/7 11:33:23
通過這兩個例子,可以總結出:
-
當任務執行時間小於周期時,下次觸發的時間是上次觸發時間+周期
-
當任務執行時間大於周期時,下次立即觸發
這個周期策略可以說時非常實用了,后續就用PeriodicTimer代替循環調用Task.Delay了。
相關文章: