C#實現定時器的幾種方案

前幾天寫了一篇java的定時器方案,應小夥伴的要求,今天這裏一下c#實現定時器的方案。

在C#裏關於定時器類就有三個

1、System.Windows.Forms.Timer

2、System.Threading.Timer

3、定義在System.Timers.Timer

下面對這三個類進行講解。

System.Windows.Forms.Timer是應用於WinForm中的,它是通過Windows消息機制實現的,類似於VB或Delphi中 的Timer控件,內部使用API SetTimer實現的。它的主要缺點是計時不精確,而且必須有消息循環,Console Application(控制檯應用程序)無法使用。

System.Timers.Timer和System.Threading.Timer非常類似,它們都是通過.NET Thread Pool實現的,輕量,計時精確,對應用程序、消息沒有特別的要求。System.Timers.Timer還可以應用於WinForm,完全取代上面的System.Windows.Forms.Timer控件。
System.Windows.Forms.Timer

計時器最宜用於 Windows 窗體應用程序中,並且必須在窗口中使用,適用於單線程環境,

在此環境中, UI 線程用於執行處理。 它要求用戶代碼提供 UI 消息泵, 並且始終從同一線程操作, 或將調用封送到

其他線程。Windows 窗體計時器組件是單線程的, 且限制爲55毫秒的準確度,準確性不高

public partial class frmTimerDemo : Form
 {
 private System.Windows.Forms.Timer timerGetTime;

 private void frmTimerDemo_Load(object sender, EventArgs e)
 {
 //創建定時器
 timerGetTime = new System.Windows.Forms.Timer();
 //設置定時器屬性
 timerGetTime.Tick+=new EventHandler(HandleTime);
 timerGetTime.Interval = 1000;
 timerGetTime.Enabled = true;
 //開啓定時器
 timerGetTime.Start();
 }
 public void HandleTime(Object myObject, EventArgs myEventArgs)
 {
 labelTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
 }
 private void frmTimerDemo_FormClosed(object sender, FormClosedEventArgs e)
 {
 //停止定時器
 timerGetTime.Stop();
 }
 }

System.Timers.Timer這個是目前我們定時項目中常用的。

System.Timers.Timer t = new System.Timers.Timer(10000);//實例化Timer類,設置間隔時間爲10000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);//到達時間的時候執行事件;
t.AutoReset = true;//設置是執行一次(false)還是一直執行(true);
t.Enabled = true;//是否執行System.Timers.Timer.Elapsed事件;
t.Start(); //啓動定時器
//上面初始化代碼可以寫到構造函數中

 
public void Execute(object source, System.Timers.ElapsedEventArgs e)
{
 t.Stop(); //先關閉定時器
 MessageBox.Show("OK!");
t.Start(); //執行完畢後再開啓器
}

這裏需要注意的是Execute方法中一定要先關閉定時器,執行完畢後再開啓。這個是本人經過測試的,如果你註釋掉這兩句,定時器會不斷的執行Execute方法,如果Execute執行的是一個很耗時的方法,會導致方法未執行完畢,定時器又啓動了一個線程來執行Execute方法。
System.Threading.Timer

線程計時器也不依賴窗體,是一種簡單的、輕量級計時器,它使用回調方法而不是使用事件,並由線程池線程提供支持,先看下面代碼

class Program
 {
 int TimesCalled = 0;
 void Display(object state)
 {
 Console.WriteLine("{0} {1} keep running.", (string)state, ++TimesCalled);
 }
 static void Main(string[] args)
 {
 Program p = new Program();
 //2秒後第一次調用,每1秒調用一次
 System.Threading.Timer myTimer = new System.Threading.Timer(p.Display, "Processing timer event", 2000, 1000);
 // 第一個參數是:回調方法,表示要定時執行的方法,第二個參數是:回調方法要使用的信息的對象,或者爲空引用,第三個參數是:調用 callback 之前延遲的時間量(以毫秒爲單位),指定 Timeout.Infinite 以防止計時器開始計時。指定零 (0) 以立即啓動計時器。第四個參數是:定時的時間時隔,以毫秒爲單位

 Console.WriteLine("Timer started.");
 Console.ReadLine();
 }
 }

上面是c#定時器的集中方案,大家在使用中一定要儘量把定時器聲明成靜態(static),如果放在實例方法中,會導致實例對象被回收導致定時器失效。

如果這篇文章對您有幫助,可轉發分享一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章