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