[Scheduled Timer]第一回:Scheduled Timer介紹


1.引言

進行軟件開發時,有沒有這樣的需求,每周都要發短信給客戶;每天晚上12:00准時生成報表;每天 8:00到10:00 之間進行http請求抓數據包;每隔2分鍾調用接口API進行同步數據等等。這些需求有一個共同的點,就是在正確的時間去做一件正確的事,這就是Scheduled Timer要干的。Scheduled Timer 是一個定時器調度,是一個對.net的Timer包裝塊。

2.定時器介紹

之前看到我的上級寫了個定時作業,利用Thread睡眠1秒鍾來循環來計時,感覺挺麻煩的。Scheduled Timer是使用System.Timers.TimerScheduled Timer是一個朋友給我的,說是老外寫的。自己用了,感覺還可以,決定介紹一下
Scheduled Timer包裝了多個功能,
  • 定時執行任務
  • 周期執行任務
  • 周期定時執行
  • 任務恢復執行
  • 任務同步、異步執行
  • 多任務執行
  • 異常處理、事件存儲、 事件過濾等等。
先看看Timer介紹,在 C#里有3 個Timer 類:
  • System.Windows.Forms.Timer
  • System.Threading.Timer
  • System.Timers.Timer
實踐證明其中 System.Timers.Timer 最為穩定並且容易進行封裝,下面就對 System.Timers.Timer進行了解下。

System.Timers.Timer類型幾個重要的成員,具體查看MSDN(摘自MSDN)。

 

構造函數
 名稱 說明
公共方法Timer() 初始化 Timer 類的新實例,並將所有屬性設置為初始值。

AutoReset默認true

Enabled默認false

Interval默認100 毫秒

SynchronizingObject默認空引用

公共方法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分鍾,以提高精確度。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM