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对象的存活,否则对回调方法的调用就会停止。