定时计算

 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对象的存活,否则对回调方法的调用就会停止。
原文地址:https://www.cnblogs.com/xuejietong/p/8969919.html