Threading.Timer是更灵活的一种计时器,可以有程序员自行设定计时周期、第一个周期前是不是要有延迟、什么时候开始运行计时器,以及给计时器调用的方法传一个参数等。
以下是Timer的构造函数,源自MSDN:
名称 | 说明 | |
---|---|---|
1 | Timer(TimerCallback) | 使用新创建的 Timer 对象作为状态对象,用一个无限周期和一个无限到期时间初始化 Timer 类的新实例。 |
2 | Timer(TimerCallback, Object, Int32, Int32) | 使用 32 位的有符号整数指定时间间隔,初始化 Timer 类的新实例。 |
3 | Timer(TimerCallback, Object, Int64, Int64) | 用 64 位有符号整数来度量时间间隔,以初始化 Timer 类的新实例。 |
4 | Timer(TimerCallback, Object, TimeSpan, TimeSpan) | 初始化 Timer 类的新实例,使用 TimeSpan 值来度量时间间隔。 |
5 | Timer(TimerCallback, Object, UInt32, UInt32) | 用 32 位无符号整数来度量时间间隔,以初始化 Timer 类的新实例。 |
这里,我觉得比较常用的是第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 指定的方法应是可重入的,这是因为该方法是在 ThreadPool 线程上调用的。 该方法在以下两种情况下可以同时在两个线程池线程中执行:一是计时器间隔小于执行该方法所需的时间;二是所有线程池线程都在使用,并且多次对该方法进行排队。”。
以上总结源于MSDN详情也请参考它:http://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.100).aspx
如有谬误,欢迎大家指正。