1.引言
進行軟件開發時,有沒有這樣的需求,每周都要發短信給客戶;每天晚上12:00准時生成報表;每天 8:00到10:00 之間進行http請求抓數據包;每隔2分鍾調用接口API進行同步數據等等。這些需求有一個共同的點,就是在正確的時間去做一件正確的事,這就是Scheduled Timer要干的。Scheduled Timer 是一個定時器調度,是一個對.net的Timer包裝塊。
2.定時器介紹
之前看到我的上級寫了個定時作業,利用Thread睡眠1秒鍾來循環來計時,感覺挺麻煩的。Scheduled Timer則是使用System.Timers.Timer。Scheduled Timer是一個朋友給我的,說是老外寫的。自己用了,感覺還可以,決定介紹一下。
Scheduled Timer包裝了多個功能,
- 定時執行任務
- 周期執行任務
- 周期定時執行
- 任務恢復執行
- 任務同步、異步執行
- 多任務執行
- 異常處理、事件存儲、 事件過濾等等。
先看看Timer介紹,在 C#里有3 個Timer 類:
- System.Windows.Forms.Timer
- System.Threading.Timer
- System.Timers.Timer
System.Timers.Timer類型幾個重要的成員,具體查看MSDN(摘自MSDN)。
構造函數
| 名稱 | 說明 | |||
|---|---|---|---|---|
Timer() |
初始化 Timer 類的新實例,並將所有屬性設置為初始值。
|
|||
Timer(Double) |
初始化 Timer 類的新實例,並將 Interval 屬性設置為指定的毫秒數。該值必須大於零並小於或等於 Int32.MaxValue。 | |||
屬性
| 名稱 | 說明 | |
|---|---|---|
AutoReset |
獲取或設置一個值,該值指示 Timer 是應在每次指定的間隔結束時引發 Elapsed 事件,還是僅在指定的間隔第一次結束后引發該事件。 | |
CanRaiseEvents |
獲取一個指示組件是否可以引發事件的值。 (繼承自 Component。) | |
Container |
獲取 IContainer,它包含 Component。 (繼承自 Component。) | |
DesignMode |
獲取一個值,用以指示 Component 當前是否處於設計模式。 (繼承自 Component。) | |
Enabled |
獲取或設置一個值,該值指示 Timer 是否應引發 Elapsed 事件。 | |
Events |
獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。) | |
Interval |
獲取或設置引發 Elapsed 事件的間隔。 該值必須大於零並小於或等於 Int32.MaxValue。 默認值為 100 毫秒。 | |
Site |
基礎結構。獲取或設置在設計模式中將 Timer 綁定到其容器的站點。 (重寫 Component.Site。) | |
SynchronizingObject |
獲取或設置對象,該對象用於在間隔過后封送發出的事件處理程序調用。 | |
方法
| 名稱 | 說明 | |
|---|---|---|
Close |
釋放由 Timer 占用的資源。 | |
Dispose() |
釋放由 Component 使用的所有資源。 (繼承自 Component。) | |
Dispose(Boolean) |
基礎結構。釋放由當前 Timer 使用的所有資源。 (重寫 Component.Dispose(Boolean)。) | |
Start |
通過將 Enabled 設置為 true 開始引發 Elapsed 事件。 | |
Stop |
通過將 Enabled 設置為 false 停止引發 Elapsed 事件。 | |
事
件
| 名稱 | 說明 | |
|---|---|---|
Disposed |
當通過調用 Dispose 方法釋放組件時發生。 (繼承自 Component。) | |
Elapsed |
達到間隔時發生。 | |
示例
public class Timer1 { private static System.Timers.Timer aTimer; public static void Main() { aTimer = new System.Timers.Timer(10000) { Interval = 2000, Enabled = true, }; aTimer.Elapsed += (s, e) => { Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); }; Console.WriteLine("Press the Enter key to exit the program."); Console.ReadLine(); // If the timer is declared in a long-running method, use // KeepAlive to prevent garbage collection from occurring // before the method ends. //GC.KeepAlive(aTimer); } }
3.總結
3個Timer其中System.Timers.Timer 最為穩定(聽說),易封裝,而且的線程的申請,是通過線程池來調度的,Timer的Interval越長,越不穩定,設置20分鍾,可能20分鍾,可能是2個小時,甚至可能不會執行,所以不要設置太長,為了提高精確度,盡量設置在10分鍾以下。Scheduled Timer里可以按分鍾、小時、天、周、月進行周期執行任務,所以設置Interval最長為1分鍾,以提高精確度。

