C#中Forms.Timer、Timers.Timer、Threading.Timer的用法剖析。本站提示廣大學習愛好者:(C#中Forms.Timer、Timers.Timer、Threading.Timer的用法剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#中Forms.Timer、Timers.Timer、Threading.Timer的用法剖析正文
本文實例講述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法剖析,分享給年夜家供年夜家參考。詳細剖析以下:
在.NET Framework外面供給了三種Timer
① System.Windows.Forms.Timer
② System.Timers.Timer
③ System.Threading.Timer
現分述以下:
1、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喪失
例如
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 毫秒。
2、System.Timers.Timer
1. 用的不是Tick事宜,而是Elapsed事宜
2. 和System.Windows.Forms.Timer一樣,用Start和Stop辦法
3. AutoReset屬性決議計時器是否是要提議一次事宜然後停滯,照樣進入開端/期待的輪回。System.Windows.Forms.Timer沒有這個屬性
4. 設置關於UI控件的同步對象(synchronizing object),對控件的UI線程提議事宜
例如
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();
private void button1_Click(object sender, EventArgs e)
{
//手動設置Timer,開端履行
Timers_Timer.Interval = 20;
Timers_Timer.Enabled = true;
Timers_Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timers_Timer_Elapsed);
time1 = DateTime.Now;
}
void Timers_Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
label1.Text = Convert.ToString((++num)); //顯示到lable
Thread.Sleep(3000);
}
private void button2_Click(object sender, EventArgs e)
{
//停滯履行
Timers_Timer.Enabled = false;
time2 = DateTime.Now;
MessageBox.Show(Convert.ToString(time2-time1));
}
}
3、System.Threading.Timer
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int num = 0;
DateTime time1 = new DateTime();
DateTime time2 = new DateTime();
System.Threading.Timer Thread_Time;
private void button1_Click(object sender, EventArgs e)
{
//啟動
Thread_Time = new System.Threading.Timer(Thread_Timer_Method,null,0,20);
time1 = DateTime.Now;
}
void Thread_Timer_Method(object o)
{
label1.Text = Convert.ToString((++num));
System.Threading.Thread.Sleep(3000);
}
private void button2_Click(object sender, EventArgs e)
{
//停滯
Thread_Time.Dispose();
time2 = DateTime.Now;
MessageBox.Show(Convert.ToString(time2-time1));
}
}
實例解析
1、用Threading.Timer時的辦法,和後面就不太雷同了,所以的參數全體在結構函數中停止了設置,並且可以設置啟動時光。並且沒有供給start和stop辦法來掌握計時器。並且是以一種回調辦法的方法完成,而不是經由過程事宜來完成的。他們之間照樣有差別的。
2、我們只要燒毀失落對象來停滯他。當你運轉時,你會發明他和後面的Timers.Timer一樣,是多線程的,重要表示在不會假逝世,調試運轉報錯。但跟讓你奇異的是,我們的代碼居然沒法讓她停滯上去。挪用了Dispose辦法沒有效。成績在那?然後有停止了測試,修正了距離時光為100,200,500,1000,3000,4000。這幾種情形。發明當距離為500ms以上是根本立時就停滯了。而距離時光絕對履行時光越短,持續履行的時光越長。這應當是在距離時光小於履行時光時多個線程運轉形成的。由於一切的線程不是同時停滯的。距離越短,線程越多,所以履行次數越多。
3、System.Threading.Timer 是一個簡略的輕量計時器,它應用回調辦法並由線程池線程供給辦事。不建議將其用於 Windows 窗體,由於其回調不在用戶界面線程長進行。
願望本文所述對年夜家的C#法式設計有所贊助。