C# Timer应用
单纯的Timer应用其实不算复杂,几个参数根据自己的情况设定就好了。如下面这段代码:
private void Run() { TimerCallback tcb = new TimerCallback(executeRun); //Timer在5秒中后(DueTime)开始执行,之后每隔1秒(Period)执行一次 Timer timer = new Timer(tcb, null, 5000, 1000); } private void executeRun(object obj) { Console.WriteLine("Timer Is Running at" + DateTime.Now.ToString()); }
在我们ScheduledJob专案中有些Job采取的就是这种方式:每隔一段特定的时间执行一次;
但是有些时候,job的执行并没有这么规律,它可能是每个月一号执行一次,或许在周一执行一次,也或许是在每天的早上三点,下午三点分别执行一次,
此时就不得不对Timer采取另外一种用法:当次Job执行完毕后,根据设定档计算出下次要执行的时间点,以此计算当前与下次执行的时间点作为DueTime,
并对Timer的DueTime进行变更。下面这段代码演示如何利用Change方法变更DueTime。
using System; using System.Collections.Generic; using System.Threading; namespace fileSystemWatcherDemo { /// <summary> /// 演示Timer DueTime变更 /// </summary> class TimerDemo { Dictionary<string, Timer> timerPool; private int dutTime = 1; static void Main(string[] args) { TimerDemo demo = new TimerDemo(); demo.beginRun();Console.Read(); } private void beginRun() { timerPool = new Dictionary<string, Timer>(); for (int i = 1; i <= 1; i++) { TimerCallback tcb = new TimerCallback(execute); //Timeout.Infinite指定Timer在DueTime后开始执行并只执行一次,若要再次执行,需使用Change方法重新指定DueTime Timer timer = new Timer(tcb, i.ToString(), getDueTime(dutTime), Timeout.Infinite); timerPool.Add(i.ToString(), timer); } } private void execute(object obj) { string ep = obj as string; if (ep != null) { Console.WriteLine("Timer " + ep + " Is Running at" + DateTime.Now.ToString()); Timer timer = timerPool[ep]; timer.Change(getDueTime(dutTime++), Timeout.Infinite);//使用Change方法重新指定DueTime } } private long getDueTime(int i) { return Convert.ToInt64(i * 1000); } } }