欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

 更新時間:2014年10月27日 09:41:56   投稿:shichen2014  
這篇文章主要介紹了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,以實例形式較為詳細的講述了.NET Framework里面提供的三種Timer具體用法,需要的朋友可以參考下

本文實例講述了C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析,分享給大家供大家參考。具體分析如下:

在.NET Framework里面提供了三種Timer

① System.Windows.Forms.Timer

② System.Timers.Timer

③ System.Threading.Timer

現(xiàn)分述如下:

一、System.Windows.Forms.Timer

1、基于Windows消息循環(huán),用事件方式觸發(fā),在界面線程執(zhí)行;是使用得比較多的Timer,Timer Start之后定時(按設定的Interval)調(diào)用掛接在Tick事件上的EvnetHandler。在這種Timer的EventHandler中可 以直接獲取和修改UI元素而不會出現(xiàn)問題--因為這種Timer實際上就是在UI線程自身上進行調(diào)用的。

2、它是一個基于Form的計時器
3、創(chuàng)建之后,你可以使用Interval設置Tick之間的跨度,用委托(delegate)hook Tick事件
4、調(diào)用Start和Stop方法,開始和停止
5、完全基于UI線程,因此部分UI相關的操作會在這個計時器內(nèi)進行
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方法。在這個方法中,我們讓她不停的加一個數(shù)字并顯示在窗體上,2個按鈕提供了對計時器的控制功能。
2、執(zhí)行的時候你去點擊其他窗體在回來,你會發(fā)現(xiàn)我們的窗體失去響應了。因為我們這里使用Thread.Sleep(3000);讓當前線程掛起,而UI失去相應,說明了這里執(zhí)行時候采用的是單線程。也就是執(zhí)行定時器的線程就是UI線程。
3、Timer 用于以用戶定義的事件間隔觸發(fā)事件。Windows 計時器是為單線程環(huán)境設計的,其中,UI 線程用于執(zhí)行處理。它要求用戶代碼有一個可用的 UI 消息泵,而且總是在同一個線程中操作,或者將調(diào)用封送到另一個線程。
4、在Timer內(nèi)部定義的了一個Tick事件,我們前面雙擊這個控件時實際是增加了一行代碼

復制代碼 代碼如下:
this.Form_Timer.Tick += new System.EventHandler(this.Form_Timer_Tick);

然后Windows將這個定時器與調(diào)用線程關聯(lián)(UI線程)。當定時器觸發(fā)時,Windows把一個定時器消息插入到線程消息隊列中。調(diào)用線程執(zhí)行一個消息泵提取消息,然后發(fā)送到回調(diào)方法中(這里的Form_Timer_Tick方法)。而這些都是單線程進行了,所以在執(zhí)行回調(diào)方法時UI會假死。所以使用這個控件不宜執(zhí)行計算受限或IO受限的代碼,因為這樣容易導致界面假死,而應該使用多線程調(diào)用的Timer。另外要注意的是這個控件時間精度不高,精度限定為 55 毫秒。

二、System.Timers.Timer

1. 用的不是Tick事件,而是Elapsed事件
2. 和System.Windows.Forms.Timer一樣,用Start和Stop方法
3. AutoReset屬性決定計時器是不是要發(fā)起一次事件然后停止,還是進入開始/等待的循環(huán)。System.Windows.Forms.Timer沒有這個屬性
4. 設置對于UI控件的同步對象(synchronizing object),對控件的UI線程發(fā)起事件

例如

復制代碼 代碼如下:
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,開始執(zhí)行
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)
{
//停止執(zhí)行
Timers_Timer.Enabled = false;
time2 = DateTime.Now;
MessageBox.Show(Convert.ToString(time2-time1));
}
}

三、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時的方法,和前面就不太相同了,所以的參數(shù)全部在構造函數(shù)中進行了設置,而且可以設置啟動時間。而且沒有提供start和stop方法來控制計時器。而且是以一種回調(diào)方法的方式實現(xiàn),而不是通過事件來實現(xiàn)的。他們之間還是有區(qū)別的。

2、我們只有銷毀掉對象來停止他。當你運行時,你會發(fā)現(xiàn)他和前面的Timers.Timer一樣,是多線程的,主要表現(xiàn)在不會假死,調(diào)試運行報錯。但跟讓你奇怪的是,我們的代碼竟然無法讓她停止下來。調(diào)用了Dispose方法沒有用。問題在那?然后有進行了測試,修改了間隔時間為100,200,500,1000,3000,4000。這幾種情況。發(fā)現(xiàn)當間隔為500ms以上是基本馬上就停止了。而間隔時間相對執(zhí)行時間越短,繼續(xù)執(zhí)行的時間越長。這應該是在間隔時間小于執(zhí)行時間時多個線程運行造成的。因為所有的線程不是同時停止的。間隔越短,線程越多,所以執(zhí)行次數(shù)越多。

3、System.Threading.Timer 是一個簡單的輕量計時器,它使用回調(diào)方法并由線程池線程提供服務。不建議將其用于 Windows 窗體,因為其回調(diào)不在用戶界面線程上進行。

希望本文所述對大家的C#程序設計有所幫助。

相關文章

  • Unity實現(xiàn)手機搖一搖震動

    Unity實現(xiàn)手機搖一搖震動

    這篇文章主要為大家詳細介紹了untiy實現(xiàn)手機搖一搖震動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C#中使用Join與GroupJoin將兩個集合進行關聯(lián)與分組

    C#中使用Join與GroupJoin將兩個集合進行關聯(lián)與分組

    這篇文章主要介紹了C#中使用Join與GroupJoin將兩個集合進行關聯(lián)與分組,文中分別對Join和GroupJoin的用法進行詳細說明,需要的朋友可以參考下
    2017-12-12
  • 詳解WPF中用戶控件和自定義控件的使用

    詳解WPF中用戶控件和自定義控件的使用

    無論是在WPF中還是WinForm中,都有用戶控件(UserControl)和自定義控件(CustomControl),這兩種控件都是對已有控件的封裝,實現(xiàn)功能重用。但是兩者還是有一些區(qū)別,本文對這兩種控件進行講解
    2023-03-03
  • C#?DateTime.Now.ToString()?用法示例講解

    C#?DateTime.Now.ToString()?用法示例講解

    這篇文章主要介紹了C#?DateTime.Now.ToString()?用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • C#數(shù)據(jù)結構與算法揭秘二 線性結構

    C#數(shù)據(jù)結構與算法揭秘二 線性結構

    本文中,我們討論了什么是線性結構,線性結構有哪些特點,并且詳細介紹了一個最簡單線性結構順序表,并且通過源代碼對她進行一些列的分析,最后還舉了兩個例子,讓我們更好的理解順序表
    2012-11-11
  • C#?Razor語法規(guī)則

    C#?Razor語法規(guī)則

    這篇文章介紹了C#?Razor的語法規(guī)則,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-01-01
  • asp.net獲取系統(tǒng)當前時間的方法詳解

    asp.net獲取系統(tǒng)當前時間的方法詳解

    這篇文章主要介紹了asp.net獲取系統(tǒng)當前時間的方法,較為詳細的分析了C#日期與時間操作所涉及的相關函數(shù)與使用技巧,需要的朋友可以參考下
    2016-06-06
  • C#類中屬性與成員變量的使用小結

    C#類中屬性與成員變量的使用小結

    本篇文章主要是對C#類中屬性與成員變量的使用進行了總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • 經(jīng)典實例講解C#遞歸算法

    經(jīng)典實例講解C#遞歸算法

    這篇文章主要用實例講解C#遞歸算法的概念以及用法,文中代碼非常詳細,幫助大家更好的參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • C#6.0新語法示例詳解

    C#6.0新語法示例詳解

    這篇文章主要給大家介紹了關于C#6.0新語法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12

最新評論