写在前面
以往一般都是用 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; } }