.NET Framework里面提供了三種Timer
System.Windows.Forms.Timer
System.Timers.Timer
System.Threading.Timer
一、System.Windows.Forms.Timer
1、基于Windows消息循環,用事件方式觸發,在界面線程執行;是使用得比較多的Timer,Timer Start之后定時(按設定的Interval)調用掛接在Tick事件上的EvnetHandler。在這種Timer的EventHandler中可 以直接獲取和修改UI元素而不會出現問題--因為這種Timer實際上就是在UI線程自身上進行調用的。
2、它是一個基于Form的計時器3、創建之后,你可以使用Interval設置Tick之間的跨度,用委托(delegate)hook Tick事件4、調用Start和Stop方法,開始和停止5、完全基于UI線程,因此部分UI相關的操作會在這個計時器內進行6、長時間的UI操作可能導致部分Tick丟失
例如
C# 代碼 復制

public partial class Form1 : Form

{
public Form1()
{
InitializeComponent();
} 
int num = 0; 
PRivate void Form_Timer_Tick(object sender, EventArgs e)
{
label1.Text = (++num).ToString();
Thread.Sleep(3000);
} 
private void button1_Click(object sender, EventArgs e)
{
Form_Timer.Start();
} 
private void button2_Click(object sender, EventArgs e)
{
Form_Timer.Stop();
}
} 
實例解析
1、上面這個是一個很簡單的功能,在Form窗體上拖了一個System.Windows.Forms.Timer控件名字為Form_Timer,在屬性窗中把Enable屬性設置為Ture,Interval是定時器的間隔時間。雙擊這個控件就可以看到 Form_Timer_Tick方法。在這個方法中,我們讓她不停的加一個數字并顯示在窗體上,2個按鈕提供了對計時器的控制功能。2、執行的時候你去點擊其他窗體在回來,你會發現我們的窗體失去響應了。因為我們這里使用Thread.Sleep(3000);讓當前線程掛起,而UI失去相應,說明了這里執行時候采用的是單線程。也就是執行定時器的線程就是UI線程。3、Timer 用于以用戶定義的事件間隔觸發事件。Windows 計時器是為單線程環境設計的,其中,UI 線程用于執行處理。它要求用戶代碼有一個可用的 UI 消息泵,而且總是在同一個線程中操作,或者將調用封送到另一個線程。4、在Timer內部定義的了一個Tick事件,我們前面雙擊這個控件時實際是增加了一行代碼this.Form_Timer.Tick += new System.EventHandler(this.Form_Timer_Tick);
然后Windows將這個定時器與調用線程關聯(UI線程)。當定時器觸發時,Windows把一個定時器消息插入到線程消息隊列中。調用線程執行一個消息泵提取消息,然后發送到回調方法中(這里的Form_Timer_Tick方法)。而這些都是單線程進行了,所以在執行回調方法時UI會假死。所以使用這個控件不宜執行計算受限或IO受限的代碼,因為這樣容易導致界面假死,而應該使用多線程調用的Timer。另外要注意的是這個控件時間精度不高,精度限定為 55 毫秒。
二、System.Timers.Timer
1. 用的不是Tick事件,而是Elapsed事件2. 和System.Windows.Forms.Timer一樣,用Start和Stop方法3. AutoReset屬性決定計時器是不是要發起一次事件然后停止,還是進入開始/等待的循環。System.Windows.Forms.Timer沒有這個屬性4. 設置對于UI控件的同步對象(synchronizing object),對控件的UI線程發起事件
例如
C# 代碼 復制

public partial class Form1 : Form

{
public Form1()
{
InitializeComponent();
} 
int num = 0;
DateTime time1 = new DateTime();
DateTime time2 = new DateTime();
//定義Timer
System.Timers.Timer Timers_Timer = new System.Timers.Timer();
新聞熱點
疑難解答