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

        }



    }

}

你可能感兴趣的:(timer)