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);
        }

    }
}

posted on 2011-02-13 14:33  easy2Dev  阅读(989)  评论(0编辑  收藏  举报

导航