.NET 包含多个定时器类,每个类提供不同的功能:
Timer
类的构造函数接受回调方法名称、dueTime、period 以及 state 作为参数。Timer 存在许多构造函数,较为常用的一种形式如下:
Timer(TimerCallback callback, object state, uint dueTime, uint period)
定时器在每次到期后调用调回方法。调回方法必须为 TimerCallback
委托形式,结构如下:
void TimerCallback(object state)
dueTime 是调回方法首次被调回之前所用的时间。
period 是两次成功调用回调函数之间的时间间隔。
state 可以是 null
或者为每次回调方法执行时要传入的对象引用。
AutoResetEvent 表示线程同步事件在一个等待线程释放后收到信号时自动重置
// 主线程不结束,定时器线程就不会结束
class program{void TimePrint(object state){ // 调回函数var _timeNow = DateTime.Now; // 获得当前系统时间Console.WriteLine($"{_timeNow}");}static void Main(){program p = new program();Timer _timer = new Timer(p.TimePrint,null,200,1000); // 构建计时器Thread.Sleep(10000); // 暂停主线程,防止主线程退出,如果不加此句,可能会导致计时器无法工作}
}
// 计时5次之后结束定时
class program{int count = 0;void TimePrint(object state){var _timeNow = DateTime.Now;var autoResetEvent = (AutoResetEvent) state; // 强制转换Console.WriteLine($"{_timeNow}");if(++ count == 5) { // 计时5次count = 0;autoResetEvent.Set(); // 重置信号}}static void Main(){program p = new program();var _autoEvent = new AutoResetEvent(false); Timer _timer = new Timer(p.TimePrint,_autoEvent,200,1000);_autoEvent.WaitOne(); // 等待计时线程信号,计时器线程发送一次重置信号后,此语句运行结束_timer.Dispose(); // 注销计时线程}
}
/*
这里不加 Thread.Sleep() 也能正常运行的原因是主线程在等待 _autoEvent.WaitOne() 的执行。
当我们把 _timer.Dispose() 注释,会发现计时器线程还在运行。(此时需要加上 Thread.Sleep() 查看结果)
*/