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

c#各種Timer類(lèi)的區(qū)別與用法介紹

 更新時(shí)間:2013年10月22日 10:18:13   作者:  
System.Threading.Timer 是一個(gè)簡(jiǎn)單的輕量計(jì)時(shí)器,它使用回調(diào)方法并由線程池線程提供服務(wù)。在必須更新用戶界面的情況下,建議不要使用該計(jì)時(shí)器,因?yàn)樗幕卣{(diào)不在用戶界面線程上發(fā)生

System.Threading.Timer 是一個(gè)簡(jiǎn)單的輕量計(jì)時(shí)器,它使用回調(diào)方法并由線程池線程提供服務(wù)。在必須更新用戶界面的情況下,建議不要使用該計(jì)時(shí)器,因?yàn)樗幕卣{(diào)不在用戶界面線程上發(fā)生。在此類(lèi)情況下,System.Windows.Threading.DispatcherTimer 是更好的選擇,因?yàn)槠涫录窃谟脩艚缑婢€程上引發(fā)的。
多線程計(jì)時(shí)器
1:System.Threading.Timer
2:System.Timers.Timer

特殊目的的單線程計(jì)時(shí)器:
1:System.Windows.Forms.Timer(Windows Forms Timer)
2:System.Windows.Threading.DispatcherTimer(WPF timer);

多線程計(jì)時(shí)器比較強(qiáng)大,精確,而且可擴(kuò)展性強(qiáng);
單線程計(jì)時(shí)器比較安全,對(duì)于更新 Windows Forms controls或者WPF這種簡(jiǎn)單任務(wù)來(lái)說(shuō)更方便。

復(fù)制代碼 代碼如下:

System.Threading.Timer是最簡(jiǎn)單的多線程計(jì)時(shí)器。在下面的例子中,定時(shí)器在5秒后開(kāi)始定時(shí)1秒的調(diào)用Tick方法。
publicstaticvoidMain()
{
//5秒后開(kāi)始運(yùn)行,接著每隔1秒的調(diào)用Tick方法
Timertmr=newTimer(Tick,"tick...",5000,1000);
Console.ReadLine();
tmr.Dispose();
}
staticvoidTick(objectdata)
{
Console.WriteLine(data);
}

.net framework提供的另一個(gè)計(jì)時(shí)器System.Timers.Timer.簡(jiǎn)單的對(duì)System.Threading.Timer進(jìn)行了包裝。增加了下面幾個(gè)特性。

實(shí)現(xiàn)了Component,所以可以在設(shè)計(jì)器顯示。代替Change方法的一個(gè)Interval屬性代替callback委托的一個(gè)Elapsed事件啟動(dòng)和停止timer的Enabled屬性,默認(rèn)是false。為了避免Enabled造成混亂,提供了Start和Stop方法。是否在每次指定的間隔結(jié)束時(shí)引發(fā)Elapsed時(shí)間,還是僅間隔第一次結(jié)束后運(yùn)行的AutoReset屬性。在WPF或Windows Forms中安全的調(diào)用方法的SynchronizingObject對(duì)象。publicstaticvoidMainThread()

復(fù)制代碼 代碼如下:

{
Timertmr=newTimer();
tmr.Interval=500;
tmr.Elapsed+=newElapsedEventHandler(tmr_Elapsed);
tmr.Start();
Console.ReadLine();
tmr.Stop();
Console.ReadLine();
tmr.Start();
Console.ReadLine();
tmr.Dispose();
}

staticvoidtmr_Elapsed(objectsender,ElapsedEventArgse)
{
Console.WriteLine("Tick...");
}


單線程計(jì)時(shí)器:
1:System.Windows.Forms.Timer(Windows Forms Timer)
2:System.Windows.Threading.DispatcherTimer(WPF timer);

單線程計(jì)時(shí)器是被設(shè)計(jì)成屬于他們執(zhí)行環(huán)境的計(jì)時(shí)器,如果你在一個(gè)Windows服務(wù)應(yīng)用程序中使用Windows Forms的Timer,timer 事件并不會(huì)被觸發(fā),只有在對(duì)應(yīng)的環(huán)境下才會(huì)被觸發(fā)。

像System.Timers.Timer一樣,他們也提供了相同的成員(Interval,Tick,Start,Stop),但是他們內(nèi)部的工作原理不同,
WPF和Windows Forms的計(jì)時(shí)器使用消息循環(huán)機(jī)制來(lái)取代線程池產(chǎn)生消息的機(jī)制。
這意味著Tick事件總是在創(chuàng)建timer的那個(gè)線程上執(zhí)行,同時(shí)也意味著如果上一個(gè)Tick消息還未被處理,即使時(shí)間超過(guò)了間隔時(shí)間,在消息循環(huán)中也只存在一個(gè)Tick消息。

下面是它們的優(yōu)點(diǎn):
你可以忘記線程安全。一個(gè)Tick事件在前一個(gè)Tick事件被處理完畢前不會(huì)被觸發(fā)。你可以直接在Tick事件處理代碼中更新控件,不需要調(diào)用Control.Invoke或Dispatcher.Invoke.
看下在Winform中使用單線程定時(shí)器的效果:

復(fù)制代碼 代碼如下:

//基于Windows消息循環(huán)的單線程計(jì)時(shí)器
privateSystem.Windows.Forms.Timertimer=newTimer(){};

publicForm1()
{
InitializeComponent();

timer.Tick+=newEventHandler(timer_Tick);
timer.Enabled=true;
}

voidtimer_Tick(objectsender,EventArgse)
{
//模擬的做一些耗時(shí)的操作
System.Threading.Thread.Sleep(2000);
}


如果運(yùn)行上面的代碼,會(huì)發(fā)現(xiàn)UI界面響應(yīng)速度很慢,
原理上面已經(jīng)介紹了:?jiǎn)尉€程計(jì)時(shí)器基于Windows消息循環(huán),應(yīng)用程序會(huì)同步的處理計(jì)時(shí)器的消息。
解決這個(gè)問(wèn)題的方法是使用多線程計(jì)時(shí)器:只要修改代碼使用多線程計(jì)時(shí)器即可:
復(fù)制代碼 代碼如下:

//使用多線程計(jì)時(shí)器
privateSystem.Timers.Timertimer=newSystem.Timers.Timer();

publicForm1()
{
InitializeComponent();

timer.Elapsed+=newSystem.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled=true;
}

voidtimer_Elapsed(objectsender,System.Timers.ElapsedEventArgse)
{
//模擬的做一些耗時(shí)的操作
System.Threading.Thread.Sleep(2000);
}


上面的例子告訴我們單線程計(jì)時(shí)器的缺點(diǎn):
除非Tick事件的處理代碼執(zhí)行的非???,否則UI界面會(huì)變得響應(yīng)很慢。
所以 WPF和Windows Forms的計(jì)時(shí)器都非常適合小任務(wù),尤其是界面更新的任務(wù)。例如時(shí)鐘和計(jì)數(shù)顯示。否則,你需要一個(gè)多線程計(jì)時(shí)器。
設(shè)為1000,再設(shè)一個(gè)變量每次加1.加12次后做你要做的事,這樣就準(zhǔn)了.

上面是2種自己使用一下,感覺(jué)那個(gè)好就可以了。

相關(guān)文章

  • WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像

    WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像

    這篇文章介紹了WPF程序?qū)⒖丶尸F(xiàn)的內(nèi)容保存成圖像的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 深入探討C#中的const、readonly關(guān)鍵字

    深入探討C#中的const、readonly關(guān)鍵字

    這篇文章主要介紹了深入探討C#中的const、readonly關(guān)鍵字,本文可以幫助你深刻理解這兩個(gè)關(guān)鍵字,而且是面試中最可能面試到的問(wèn)題哦,需要的朋友可以參考下
    2014-08-08
  • C#支付寶掃碼支付代碼完整版

    C#支付寶掃碼支付代碼完整版

    這篇文章主要為大家詳細(xì)介紹了C#支付寶掃碼支付代碼的完整版本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • c#文件下載示例的4種方法分享

    c#文件下載示例的4種方法分享

    這篇文章主要介紹了c#文件下載示例的4種方法,有TransmitFile實(shí)現(xiàn)下載,WriteFile實(shí)現(xiàn)下載,WriteFile分塊下載,流方式下載,需要的朋友可以參考下
    2014-03-03
  • c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例

    c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例

    這篇文章主要介紹了c#后臺(tái)線程訪問(wèn)前臺(tái)控件并顯示信息示例,需要的朋友可以參考下
    2014-03-03
  • 利用thrift實(shí)現(xiàn)js與C#通訊的實(shí)例代碼

    利用thrift實(shí)現(xiàn)js與C#通訊的實(shí)例代碼

    利用thrift實(shí)現(xiàn)js與C#通訊的實(shí)例代碼,需要的朋友可以參考一下
    2013-04-04
  • C#中事件的繼承實(shí)例分析

    C#中事件的繼承實(shí)例分析

    這篇文章主要介紹了C#中事件的繼承,通過(guò)一個(gè)面向?qū)ο蟪绦驅(qū)嵗齺?lái)說(shuō)明子類(lèi)調(diào)用父類(lèi)事件的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-08-08
  • C#實(shí)現(xiàn)FTP上傳文件的方法

    C#實(shí)現(xiàn)FTP上傳文件的方法

    這篇文章介紹了C#實(shí)現(xiàn)FTP上傳文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#實(shí)現(xiàn)繪制浮雕圖片效果實(shí)例

    C#實(shí)現(xiàn)繪制浮雕圖片效果實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)繪制浮雕圖片效果實(shí)例,是C#程序設(shè)計(jì)中非常實(shí)用的一個(gè)功能,需要的朋友可以參考下
    2014-08-08
  • C#連接SQL Server的實(shí)現(xiàn)方法

    C#連接SQL Server的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#連接SQL Server的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評(píng)論