1 internal static class TimerDemo 2 { 3 //提供以指定的时间间隔对线程池线程执行方法的机制 4 private static Timer timer; 5 6 //这个方法签名必须和TimerCallback委托匹配 7 private static void Status(object state) 8 { 9 //这个方法由一个线程池线程执行 10 Console.WriteLine("In Status at {0}", DateTime.Now); 11 12 //模拟其它工作 13 Thread.Sleep(1000); 14 15 //返回前让Timer在2秒后再次触发 16 //更改计时器的启动时间和方法调用之间的间隔 17 // 参数: 18 // dueTime: 19 // 延迟之前调用的回调方法时指定的时间量 System.Threading.Timer 构造的以毫秒为单位。 指定 System.Threading.Timeout.Infinite 20 // 以防止计时器重新启动。 指定零 (0) 可立即重新启动计时器。 21 // 22 // period: 23 // 回调方法的调用之间的时间间隔时指定 System.Threading.Timer 构造的以毫秒为单位。 指定 System.Threading.Timeout.Infinite 24 // 可以禁用定期终止。 25 timer.Change(2000, Timeout.Infinite); 26 } 27 28 public static void TimerMethod() 29 { 30 Console.WriteLine("Checking status every 2 seconds."); 31 32 //创建但不启动计时器,确保timer在线程池线程调用Status之前引用该计时器 33 // 参数: 34 // callback: 35 // 一个 System.Threading.TimerCallback 委托,表示要执行的方法。 36 // 37 // state: 38 // 一个包含回调方法中,要使用信息的对象或 null。 39 // 40 // dueTime: 41 // 在之前的延迟时间量 callback 调用,以毫秒为单位。 指定 System.Threading.Timeout.Infinite 以防止启动计时器。 42 // 指定零 (0) 可立即启动计时器。 43 // 44 // period: 45 // 调用之间的时间间隔 callback, ,以毫秒为单位。 指定 System.Threading.Timeout.Infinite 可以禁用定期终止。 46 timer = new Timer(Status, null, Timeout.Infinite, Timeout.Infinite); 47 48 //现在timer已被赋值,可以启动计时器了 49 //现在在Status中调用Change,保证不会抛出NullReferenceException 50 timer.Change(0, Timeout.Infinite); 51 } 52 } 53 54 internal static class DelayDemo 55 { 56 //该方法可以获取想要的任何参数 57 public static async void Status() 58 { 59 while (true) 60 { 61 Console.WriteLine("Checking status at {0}", DateTime.Now); 62 63 //这里执行需要检查状态的代码 64 65 //在循环末尾,不阻塞线程的前提下延迟2秒 66 //await允许线程返回 67 await Task.Delay(2000); 68 //2秒后,某个线程会在await之后介入并继续循环 69 } 70 } 71 }
Timer对象被垃圾回收时,它的终结代码告诉线程池取消计时器,使它不再触发。所以,使用Timer对象时,要确定有一个变量在保持Timer对象的存活,否则对回调方法的调用就会停止。