写在前面
以往一般都是用 System.Timers.Timer 来做计时器,而 System.Threading.Timer 也可以实现计时器功能,并且还可以配置首次执行间隔,在功能上比System.Timers.Timer更加丰富;根据这个特性就可以实现按指定时间间隔对委托进行单次调用。 执行的回调委托也是在 ThreadPool 线程上执行,支持多线程运行环境。
代码实现
using System;
using System.Threading;
using System.Threading.Tasks;class Program
{private static Timer timer;static void Main(string[] args){var dueTime = 1000; // 首次执行延迟时间var interval = 2000; // 后续执行间隔时间var timerState = new TimerState { Counter = 0 };timer = new Timer(callback: new TimerCallback(TimerTask),state: timerState,dueTime: dueTime,period: interval);Console.WriteLine($"{DateTime.Now:yyyy-MM-dd:HH:mm:ss.fff}: 准备开始执行...");while (timerState.Counter <= 10){Task.Delay(1000).Wait();}timer.Dispose();Console.WriteLine($"{DateTime.Now:yyyy-MM-dd:HH:mm:ss.fff}: 完成.");}private static void TimerTask(object timerState){Console.WriteLine($"{DateTime.Now:yyyy-MM-dd:HH:mm:ss.fff}: 触发了一次新的回调.");var state = timerState as TimerState;Interlocked.Increment(ref state.Counter);}class TimerState{// 计数器public int Counter;}
}