Timer簡單介紹
構造函數
通過ILSpy反編譯可以看到Timer的內部代碼。
Timer 的默認構造函數里賦了初值,所以當我們初始化Timer的時候,已經有了默認值。
Timer 的帶參數的構造函數會重新給 interval(獲取或設置引發 Elapsed 事件的間隔,以毫秒為單位。)賦值。
Elapsed事件(達到間隔時發生)
匿名函數傳遞
System.Timers.Timer t = new System.Timers.Timer(1000 * 60 * 10); //實例化,設置時間間隔為十分鍾,此處參數單位為毫秒。//匿名函數傳遞 t.Elapsed += (s, e) => { print(DateTime.Now); };
非匿名函數傳遞
System.Timers.Timer t = new System.Timers.Timer(1000 * 60 * 10); //實例化,設置時間間隔為十分鍾,此處參數單位為毫秒。 t.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => print(DateTime.Now));//非匿名函數傳遞
下面是寫在 Global.asax.cs 里例子,項目啟動的時候會執行:
//第一個訪問網站的用戶會觸發該方法。 protected void Application_Start() { DateTime dt = DateTime.Now;
System.Timers.Timer t = new System.Timers.Timer(1000 * 60 * 10); //實例化,設置時間間隔為十分鍾,此處參數單位為毫秒 t.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => print(dt)); t.AutoReset = true; //每到指定時間Elapsed事件是觸發一次(false),一直觸發(true) t.Enabled = true; //是否觸發Elapsed事件 t.Start(); }
定時器
現在我們有個需求,需要每天12點來觸發 print 方法,那么我們需要利用 Timer 寫一個定時器。通過更改 Interval 屬性的數值,來調整觸發方法的時間。
下面是demo

private static readonly System.Timers.Timer Timer = new System.Timers.Timer(); //初始化。 private static DateTime dt = new DateTime(); //固定時間。 /// <summary> /// 程序入口(自行調用) /// </summary> /// <param name="timing">定時時間(格式:年月日時分秒)</param> public void Init() { dt = DateTime.Now; SetInterval(); Timer.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => SetInterval()); } /// <summary> /// 定時器 /// </summary> /// <param name="timing">定時時間(格式:年月日時分秒)</param> private void SetInterval() { Timer.Stop(); var now = DateTime.Now; if (now >= dt)//如果當前時間>=定時時間 { //定時結束之后,你要執行的代碼 print(now); //---------------------------------------------------------- //此處可修改dt。更改需求。 //---------------------------------------------------------- dt = DateTime.Now.Date.AddDays(1).AddHours(12); //重新計算定時時間,第二天12點再執行。 //dt = DateTime.Now.AddMinutes(0.1);//重新計算定時時間,每分鍾執行一次。 SetInterval(); } else//如果當前時間<定時時間 { Timer.Interval = dt.Subtract(now).TotalMilliseconds;//重新計算定時時間,按毫秒計算。 Timer.Start(); } } /// <summary> /// 測試輸出 /// </summary> public void print(DateTime dt) { num++; Console.WriteLine("執行第{0}次,時間:{1}", num, dt); }
效果:
現在需求變更為每天11點到下午17點的時候觸發,間隔1分鍾。
下面是demo

private static readonly System.Timers.Timer Timer = new System.Timers.Timer(); //初始化。 private static DateTime dtStar = new DateTime(); //時間段--開始時間。 private static DateTime dtEnd = new DateTime(); //時間段--結束時間。 private static int intervalTime = 10;//間隔時間(分鍾)。 /// <summary> /// 程序入口(自行調用) /// </summary> /// <param name="timing">定時時間(格式:年月日時分秒)</param> public void Init() { dtStar = DateTime.Now.Date.AddDays(0).AddHours(11);//今天11點。 dtEnd = DateTime.Now.Date.AddDays(0).AddHours(17);//今天17點。 intervalTime = 1;//每1分鍾執行一次。 SetInterval(); Timer.Elapsed += new System.Timers.ElapsedEventHandler((s, e) => SetInterval()); } /// <summary> /// 定時器(間斷) /// </summary> /// <param name="timing">起始時間</param> private void SetInterval() { Timer.Stop(); var now = DateTime.Now; if (now.Hour >= dtStar.Hour && now.Date == dtStar.Date)//達到開始時間,並且是今天 { if (dtEnd.Subtract(now).TotalMinutes >= intervalTime)//小於結束時間 { print(now);//打印 //---------------------------------------------------------- //此處可修改dtStar,dtEnd,intervalTime,三個參數。更改需求。 //---------------------------------------------------------- Timer.Interval = now.AddMinutes(intervalTime).Subtract(now).TotalMilliseconds; Timer.Start(); } else { //---------------------------------------------------------- //此處可修改dtStar,dtEnd,intervalTime,三個參數。更改需求。 //---------------------------------------------------------- dtStar = DateTime.Now.Date.AddDays(1).AddHours(11);//第二天11點。 dtEnd = DateTime.Now.Date.AddDays(1).AddHours(17);//第二天17點。 intervalTime = 2;//每2分鍾執行一次。 Timer.Interval = dtStar.Subtract(now).TotalMilliseconds; Timer.Start(); } } else//如果 定時時間>當前時間 { Timer.Interval = dtStar.Subtract(now).TotalMilliseconds;//重新計算定時時間,按毫秒計算。 Timer.Start(); } } /// <summary> /// 測試輸出 /// </summary> public void print(DateTime dt) { num++; Console.WriteLine("執行第{0}次,時間:{1}", num, dt); }