關於C#中timer類 在C#裡關於
定時器類就有3個
1.定義在System.Windows.Forms裡
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,完全取代上面的 Timer控制項。它們的缺點是不支援直接的拖放,需要手工編碼。
例:
使用System.Timers.Timer類
System.Timers.Timer t = new System.Timers.Timer(10000);//執行個體化Timer類,設定間隔時間為10000毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到達時間的時候執行事件;
t.AutoReset = true;//設定是執行一次(false)還是一直執行(true);
t.Enabled = true;//是否執行System.Timers.Timer.Elapsed事件;
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("OK!");
}
private void button1_Click(object sender, System.EventArgs e) ...{
System.Timers.Timer t = new System.Timers.Timer(1 * 60 * 60 * 1000);
t.Elapsed += new System.Timers.ElapsedEventHandler(Timer_TimesUp);
t.Enabled = true;
}
private void Timer_TimesUp(object sender, System.Timers.ElapsedEventArgs e) ...{
MessageBox.Show("hello");
}
//如果非要button 觸發的話:
private void Form1_Load(object sender, System.EventArgs e) ...{
System.Timers.Timer t = new System.Timers.Timer(1 * 60 * 60 * 1000);
t.Elapsed += new System.Timers.ElapsedEventHandler(Timer_TimesUp);
t.Enabled = true;
}
private void button1_Click(object sender, System.EventArgs e) ...{
MessageBox.Show("hello");
}
private void Timer_TimesUp(object sender, System.Timers.ElapsedEventArgs e) ...{
this.button1.PerformClick();
}
在應用裡的timer和組件裡的timer有什麼不同2007-03-30 10:42
伺服器計時器、Windows 計時器和線程計時器 在 Visual Studio .NET 和 .NET Framework 中有三種計時器控制項:基於伺服器的計時器,位於“工具箱”的“組件”選項卡上;基於 Windows 的標準計時器,位於“工具箱”的“Windows 表單”選項卡上,以及僅可在編程時使用的線程計時器。基於 Windows 的計時器從 Visual Basic 的 1.0 版起就存在於該產品中並且基本上保持不變。該計時器已經為在 Windows 表單應用程式中使用而進行了最佳化。基於伺服器的計時器是傳統的計時器為了在伺服器環境上運行而最佳化後的更新版本。線程計時器是一種簡單的、輕量級計時器,使用回調方法而不是事件,並由線程池線程提供。 在 Win32 體繫結構中有兩種類型的線程:UI 線程和輔助線程。UI 線程絕大多數時間處於空閑狀態,等待訊息迴圈中的訊息到來。一旦接收到訊息,它們就進行處理並等待下一個訊息到來。另外,輔助線程用來執行幕後處理而且不使用訊息迴圈。Windows 計時器和基於伺服器的計時器在運行時都使用 Interval 屬性。線程計時器的時間間隔在 Timer 建構函式中設定。計時器的設計目的各不相同,它們的線程處理明確地指出了這一點: Windows 計時器是為單線程環境設計的,其中,UI 線程用於執行處理。Windows 計時器的精度限定為 55 毫秒。這些傳統計時器要求使用者代碼有一個可用的 UI 訊息泵,而且總是在同一個線程中操作,或者將調用封送到另一個線程。對於 COM 組件來說,這樣會降低效能。 基於伺服器的計時器是為在多線程環境下與輔助線程一起使用而設計的。由於它們使用不同的體繫結構,因此基於伺服器的計時器可能比 Windows 計時器精確得多。伺服器計時器可以線上程之間移動來處理引發的事件。 對訊息不線上程上發送的方案中,線程計時器是非常有用的。例如,基於 Windows 的計時器依賴於作業系統計時器的支援,如果不線上程上發送訊息,與計時器相關的事件將不會發生。在這種情況下,線程計時器就非常有用。 Windows 計時器位於 System.Windows.Forms 命名空間中,伺服器計時器位於 System.Timers 命名空間中,而線程計時器位於 System.Threading 命名空間中。 |
Timer 組件2007-12-30 15:25
Timer 組件是基於伺服器的計時器,它使您能夠指定在應用程式中引發 Elapsed 事件的周期性間隔。然後可以操控此事件以提供定期處理。例如,假設您有一台關鍵性伺服器,必須每周 7 天、每天 24 小時都保持運行。可以建立一個使用 Timer 的服務,以定期檢查伺服器並確保系統開啟並在運行。如果系統不響應,則該服務可以嘗試重新啟動伺服器或通知管理員。 基於伺服器的 Timer 是為在多線程環境中用於輔助線程而設計的。伺服器計時器可以線上程間移動來處理引發的 Elapsed 事件,這樣就可以比 Windows 計時器更精確地按時引發事件。有關基於伺服器的計時器的更多資訊,請參見“基於伺服器的計時器介紹”。 基於 Interval 屬性的值,Timer 組件引發 Elapsed 事件。可以處理該事件以執行所需的處理。例如,假設您有一個聯機銷售應用程式,它不斷向資料庫發送銷售訂單。編譯發貨指令的服務分批處理訂單,而不是分別處理每個訂單。可以使用 Timer 每 30 分鐘啟動一次批處理。
當 AutoReset 設定為 false 時,Timer 只在第一個 Interval 過後引發一次 Elapsed 事件。若要保持以 Interval 時間間隔引發 Elapsed 事件,請將 AutoReset 設定為 true。 |
Elapsed 事件在 ThreadPool 線程上引發。如果 Elapsed 事件的處理時間比 Interval 長,在另一個 ThreadPool 線程上將會再次引發此事件。因此,事件處理常式應當是可重新進入的。 下面的樣本建立一個 Timer,它每隔五秒鐘在控制台上顯示一次“Hello World!”。 using System; using System.Timers; public class Timer1 { public static void Main() { // Normally, the timer is declared at the class level, so // that it doesn't go out of scope when the method ends. // In this example, the timer is needed only while Main // is executing. However, KeepAlive must be used at the // end of Main, to prevent the JIT compiler from allowing // aggressive garbage collection to occur before Main // ends. System.Timers.Timer aTimer = new System.Timers.Timer(); // Hook up the Elapsed event for the timer. aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); // Set the Interval to 2 seconds (2000 milliseconds). aTimer.Interval = 2000; aTimer.Enabled = true; Console.WriteLine("Press the Enter key to exit the program."); Console.ReadLine(); // Keep the timer alive until the end of Main. GC.KeepAlive(aTimer); } // Specify what you want to happen when the Elapsed event is // raised. private static void OnTimedEvent(object source, ElapsedEventArgs e) { Console.WriteLine("Hello World!"); } } |