Threading.Timer是更灵活的一种计时器,可以有程序员自行设定计时周期、第一个周期前是不是要有延迟、什么时候开始运行计时器,以及给计时器调用的方法传一个参数等。
以下是Timer的构造函数,源自MSDN:
这里,我觉得比较常用的是第1、2、4构造函数。
Timer(TimerCallback) 此构造函数仅仅定义计时器本身和TimerCallBack Delegate 类型的方法(此方法需带有一个object类型的参数)。不会显示给这个方法传递参数,其实传递给他的是这个计时器对象本身(详见MSDN中的例子代码)。此种计时器的启动是要用计时器实例调用Change(int32, int32)——还有一些类似于构造函数的重载方法。Change(int32, int32)方法第一个参数为第一次启动计时器的延时,以毫秒计算;第二个参数为调用TimerCallBack代理的方法的周期,也以毫秒计。这两个参数均可以设置为Timeout.Infinite,这是个“const int”,值为-1,设置这个值的话等同于停止正在运行的Timer。其实次构造函数本省就是用Timeout.Infinite这个值来初始化的,并把Timer实例本身传递给了周期要调用的方法。
Timer(TimerCallback, Object, Int32, Int32) 构造函数分别为符合TimerCallBack类型的代理实例、代理实例要传递给代理方法的参数、计时器启动延时、计时器调用代理的周期。这个方法中两个Int32参数的解释,可以参见上一个构造函数中Change(int32, int32)方法的解释。此构造方法相对要灵活,起码可以完成给定时调用方法传递参数的功能。如果延迟时间和周期是固定值,则定时器在初始化后立即启动,要是设置成Timeout.Infinte,就需要计时器实例调用Change(int32, int32)方法启动计时器了(当然,Change(int32, int32)方法可以在计时器实例化后随时调用,设置延时和改变周期)。
Timer(TimerCallback, Object, TimeSpan, TimeSpan) 相对与上一个构造函数提供了较为便利的延时和周期的计算形式,配合Change(TimeSpan, TimeSpan)方法使计时器更加的灵活。TimeSpan提供了方便的加减操作函数,需要提醒的是,此对象加减之后要由变量接收,如:
_timeSpan1 = _timeSpan1.Add(_timeSpan2);
此外,Threading.TimerCallBack类型方法是被分配到线程池中执行的,“为 callback 指定的方法应是可重入的,这是因为该方法是在该方法在以下两种情况下可以同时在两个线程池线程中执行:一是计时器间隔小于执行该方法所需的时间;二是所有线程池线程都在使用,并且多次对该方法进行排队。”。
以上总结源于MSDN详情也请参考它:http://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.100).aspx
如有谬误,欢迎大家指正。