最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

本文實(shí)例講述了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之后定時(shí)(按設(shè)定的Interval)調(diào)用掛接在Tick事件上的EvnetHandler。在這種Timer的EventHandler中可 以直接獲取和修改UI元素而不會出現(xiàn)問題--因?yàn)檫@種Timer實(shí)際上就是在UI線程自身上進(jìn)行調(diào)用的。

2、它是一個(gè)基于Form的計(jì)時(shí)器
3、創(chuàng)建之后,你可以使用Interval設(shè)置Tick之間的跨度,用委托(delegate)hook Tick事件
4、調(diào)用Start和Stop方法,開始和停止
5、完全基于UI線程,因此部分UI相關(guān)的操作會在這個(gè)計(jì)時(shí)器內(nèi)進(jìn)行
6、長時(shí)間的UI操作可能導(dǎo)致部分Tick丟失

例如

復(fù)制代碼 代碼如下:
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();
}
}

實(shí)例解析

1、上面這個(gè)是一個(gè)很簡單的功能,在Form窗體上拖了一個(gè)System.Windows.Forms.Timer控件名字為Form_Timer,在屬性窗中把Enable屬性設(shè)置為Ture,Interval是定時(shí)器的間隔時(shí)間。雙擊這個(gè)控件就可以看到 Form_Timer_Tick方法。在這個(gè)方法中,我們讓她不停的加一個(gè)數(shù)字并顯示在窗體上,2個(gè)按鈕提供了對計(jì)時(shí)器的控制功能。
2、執(zhí)行的時(shí)候你去點(diǎn)擊其他窗體在回來,你會發(fā)現(xiàn)我們的窗體失去響應(yīng)了。因?yàn)槲覀冞@里使用Thread.Sleep(3000);讓當(dāng)前線程掛起,而UI失去相應(yīng),說明了這里執(zhí)行時(shí)候采用的是單線程。也就是執(zhí)行定時(shí)器的線程就是UI線程。
3、Timer 用于以用戶定義的事件間隔觸發(fā)事件。Windows 計(jì)時(shí)器是為單線程環(huán)境設(shè)計(jì)的,其中,UI 線程用于執(zhí)行處理。它要求用戶代碼有一個(gè)可用的 UI 消息泵,而且總是在同一個(gè)線程中操作,或者將調(diào)用封送到另一個(gè)線程。
4、在Timer內(nèi)部定義的了一個(gè)Tick事件,我們前面雙擊這個(gè)控件時(shí)實(shí)際是增加了一行代碼

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

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

二、System.Timers.Timer

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

例如

復(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)
{
//手動(dòng)設(shè)置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

復(fù)制代碼 代碼如下:
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)
{
//啟動(dòng)
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));
}
}

實(shí)例解析

1、用Threading.Timer時(shí)的方法,和前面就不太相同了,所以的參數(shù)全部在構(gòu)造函數(shù)中進(jìn)行了設(shè)置,而且可以設(shè)置啟動(dòng)時(shí)間。而且沒有提供start和stop方法來控制計(jì)時(shí)器。而且是以一種回調(diào)方法的方式實(shí)現(xiàn),而不是通過事件來實(shí)現(xiàn)的。他們之間還是有區(qū)別的。

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

3、System.Threading.Timer 是一個(gè)簡單的輕量計(jì)時(shí)器,它使用回調(diào)方法并由線程池線程提供服務(wù)。不建議將其用于 Windows 窗體,因?yàn)槠浠卣{(diào)不在用戶界面線程上進(jìn)行。

希望本文所述對大家的C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 深入c# Func委托的詳解

    深入c# Func委托的詳解

    本篇文章是對c#中的Func委托進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#創(chuàng)建及讀取DAT文件操作

    C#創(chuàng)建及讀取DAT文件操作

    這篇文章主要介紹了C#創(chuàng)建及讀取DAT文件操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#中文隨機(jī)數(shù)實(shí)現(xiàn)方法

    C#中文隨機(jī)數(shù)實(shí)現(xiàn)方法

    這篇文章主要介紹了C#中文隨機(jī)數(shù)實(shí)現(xiàn)方法,涉及C#針對中文及隨機(jī)數(shù)的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • C#留言時(shí)間格式化

    C#留言時(shí)間格式化

    本文給大家分享的是仿微博或者空間中,發(fā)布內(nèi)容之后提示NN秒之前留言的代碼,主要是通過發(fā)布時(shí)間和當(dāng)前時(shí)間直接的差值來計(jì)算,十分的簡單實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • c++與c#的時(shí)間轉(zhuǎn)換示例分享

    c++與c#的時(shí)間轉(zhuǎn)換示例分享

    這篇文章主要介紹了C++與C#的時(shí)間轉(zhuǎn)換方法,大家參考使用吧
    2013-12-12
  • DevExpress實(shí)現(xiàn)禁用TreeListNode CheckBox的方法

    DevExpress實(shí)現(xiàn)禁用TreeListNode CheckBox的方法

    這篇文章主要介紹了DevExpress實(shí)現(xiàn)禁用TreeListNode CheckBox的方法,在項(xiàng)目開發(fā)中有應(yīng)用價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C#使用HtmlAgilityPack實(shí)現(xiàn)解析提取HTML內(nèi)容

    C#使用HtmlAgilityPack實(shí)現(xiàn)解析提取HTML內(nèi)容

    HtmlAgilityPack是一個(gè)HTML解析類庫,這篇文章主要為大家詳細(xì)介紹了C#如何使用HtmlAgilityPack實(shí)現(xiàn)解析提取HTML內(nèi)容,感興趣的小伙伴可以參考一下
    2023-12-12
  • C# 中this關(guān)鍵字的主要作用

    C# 中this關(guān)鍵字的主要作用

    this 關(guān)鍵字在C#中主要用于引用當(dāng)前對象,區(qū)分字段與局部變量,調(diào)用其他構(gòu)造函數(shù)以及傳遞當(dāng)前對象給其他方法或構(gòu)造函數(shù),本文重點(diǎn)介紹C# this關(guān)鍵字的作用,感興趣的朋友一起看看吧
    2024-02-02
  • C#實(shí)現(xiàn)字符串格式化的示例代碼

    C#實(shí)現(xiàn)字符串格式化的示例代碼

    在日常編程中,經(jīng)常需要對字符串進(jìn)行格式化操作,以便呈現(xiàn)為不同的格式,本文主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)字符串格式化的相關(guān)知識,希望對大家有所幫助
    2023-12-12
  • Unity為軟件添加使用有效期的具體步驟

    Unity為軟件添加使用有效期的具體步驟

    今天小編遇到這樣一個(gè)需求需要為軟件設(shè)定一個(gè)使用有效期,當(dāng)超過指定時(shí)間后,程序無法執(zhí)行,實(shí)現(xiàn)思路并不復(fù)雜,今天小編通過本文給大家分享Unity為軟件添加使用有效期的具體步驟,感興趣的朋友一起看看吧
    2022-03-03

最新評論

河北省| 成武县| 宁陵县| 扬中市| 安溪县| 安庆市| 安溪县| 皮山县| 太白县| 文昌市| 黄浦区| 仪陇县| 公主岭市| 沈丘县| 南京市| 子洲县| 遂平县| 北碚区| 育儿| 故城县| 泾阳县| 大竹县| 营口市| 漳平市| 铜川市| 会昌县| 合江县| 平潭县| 绩溪县| 白银市| 怀柔区| 平顺县| 珲春市| 北宁市| 聂拉木县| 门头沟区| 镇坪县| 鄂托克前旗| 尼木县| 京山县| 北辰区|