自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET Framework計時器對象應(yīng)用技巧分享

開發(fā) 后端
.NET Framework計時器對象中分別在System.Timers;System.Threading;System.Windows.Forms中存在三種Timer類型。

.NET Framework作為一種比較全面的開發(fā)環(huán)境,可以為用戶創(chuàng)造出多種適合不同需求的環(huán)境進(jìn)行方便的開發(fā)。不管在哪種平臺領(lǐng)域,計時器對象在日常開發(fā)中有著相當(dāng)重要的地位。在.NET中,如果平常你不是特別注意的話,那你肯定不會發(fā)現(xiàn),在.NET Framework計時器對象中竟然存在三個Timer類型,分別在:#t#

System.Timers

System.Threading

System.Windows.Forms

三個不同的命名空間下。(這里我們還暫且不算ASP.NET AJAX中新的那個Timer,這個Timer是用于客戶端的計時器對象。)那么我相信很多人會不解,都是定時器的功能,為什么還要定義這么多不同的Timer類型呢?拋開其在使用上的細(xì)微不同,我們這里就根據(jù)MSDN對這三種不同Timer的描述來作一個比較:

  1. System.Timers.Timer :System.
    ComponentModel.Component,
    ISupportInitialize 

首先這個.NET Framework計時器對象Timer類型是一個標(biāo)準(zhǔn)的定時器對象,我們暫且認(rèn)為它的名稱空間緣故吧,它存在于System程序集里面。在MSDN里面對它的定義是一個Server-Based Timer(基于服務(wù)器的計時器),它是為在多線程環(huán)境中用于輔助線程而設(shè)計的。服務(wù)器計時器可以在線程間移動來處理引發(fā)的 Elapsed 事件,因此它是最為精確的一種計時器。我們可以簡單的把它理解為Windows服務(wù)的執(zhí)行機(jī)制,只要宿主線程沒有被釋放,System.Timers.Timer只要處于活動狀態(tài),就會一直存在下去,直到你手工停止或宿主線程結(jié)束。

MSDN上還有這樣一段話“Elapsed 事件在 ThreadPool 線程上引發(fā)。如果 Elapsed 事件的處理時間比 Interval 長,在另一個 ThreadPool 線程上將會再次引發(fā)此事件。因此,事件處理程序應(yīng)當(dāng)是可重入的。”也就是說,在你在每次的Elapsed 事件處理在下一次輪循時間到來的時候還沒有結(jié)束,Timer對象仍然會另一個線程中啟動Elapsed 的處理事件。這種機(jī)制的后果就可能會導(dǎo)致你的Timer已經(jīng)被結(jié)束了,但是還會再執(zhí)行Elapsed事件,MSDN的原文:“在一個線程調(diào)用 Stop 方法或?qū)?Enabled 屬性設(shè)置為 false 的同時,可在另一個線程上運行事件處理方法。這可能導(dǎo)致在計時器停止之后引發(fā) Elapsed 事件。”針對這種情況,如果你不愿讓它發(fā)生,你可能就必須做一些額外的工作來避免它的發(fā)生。這種機(jī)制同樣也適用于System.Threading.Timer。

  1. System.Threading.Timer :
     MarshalByRefObject, IDisposable 

這是一種輕量型的計時數(shù),它在使用上與System.Timers.Timer的不同表現(xiàn)在:

使用回調(diào)機(jī)制,而不是事件機(jī)制。

.NET Framework計時器對象中的構(gòu)造器中可以指定首次執(zhí)行時間(構(gòu)建后或修改后開始算)和間隔執(zhí)行時間,這兩個時間(dueTime,period)可以是不同的。
它是沒有開始和結(jié)束控制接口,從構(gòu)建開始算,直至釋放結(jié)束。

它基于ThreadPool線程機(jī)制,遵循著上述System.Timers.Timer的相同原則(紅色部分)。同時它在生命周期方面也有必須要注意的地方,它沒有開始或停止(有釋放接口Dispose)方法。在它的生命周期中,必須被其它對象所引用。一旦它不被任何對象所引用,那么就意味著這個Timer對象變成一個不可達(dá)對象,會被GC回收。MSDN原文解釋:

“只要在使用 Timer,就必須保留對它的引用。對于任何托管對象,如果沒有對 Timer 的引用,計時器會被垃圾回收。即使 Timer 仍處在活動狀態(tài),也會被回收。”

MSDN中還有這樣一段話:

“System.Threading..::.Timer is a simple, lightweight timer that uses callback methods and is served by thread pool threads. It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread. System.Windows.Forms..::.Timer is a better choice for use with Windows Forms. For server-based timer functionality, you might consider using System.Timers..::.Timer, which raises events and has additional features.”

它告訴我們:System.Threading.Timer是一個簡單的,輕量級的,利用回調(diào)機(jī)制和線程池機(jī)制的計時器。在Windows Forms的場景下不建議我們使用這個對象,因為UI線程并不觸發(fā)回調(diào)函數(shù),取而代之是Windows.Forms.Timer ,而如果希望利用基于服務(wù)器計時器的功能,則建議我們使用System.Timers.Timer。

System.Windows.Forms.Timer : System.ComponentModel.Component
這一種專門服務(wù)于Windows Forms的計時器,它在機(jī)制和原理上都與前面兩種有著比較大的區(qū)別。在接口使用上與System.Timers.Timer比較相似,同時具備了一些的Windows Form控件的特征。同時它的精度設(shè)計上也不是很高。

“Timer 用于以用戶定義的事件間隔觸發(fā)事件。Windows 計時器是為單線程環(huán)境設(shè)計的,其中,UI 線程用于執(zhí)行處理。它要求用戶代碼有一個可用的 UI 消息泵,而且總是在同一個線程中操作,或者將調(diào)用封送到另一個線程。

使用此計時器時,請使用 Tick 事件執(zhí)行輪詢操作,或在指定的時間內(nèi)顯示啟動畫面。每當(dāng) Enabled 屬性設(shè)置為 true 且 Interval 屬性大于 0 時,將引發(fā) Tick 事件,引發(fā)的時間間隔基于 Interval 屬性設(shè)置。”

在三種.NET Framework計時器對象中,都會一些共性和不同側(cè)重點,希望通過這樣一比較,讓大家都能對.NET Framework中的Timer對象有更深的了解,進(jìn)而正確合理的使用它們。

責(zé)任編輯:曹凱 來源: 博客園
相關(guān)推薦

2010-01-06 17:02:28

.Net Framew

2010-01-05 13:45:15

.NET Framew

2010-01-25 11:29:33

Android計時器

2011-05-31 16:50:35

Android 線程

2012-05-08 13:58:37

SharePoint

2024-07-18 08:46:58

.NET輕量級計時器測量代碼塊

2011-09-08 14:01:01

Android Wid實例

2010-01-22 14:51:31

VB.NET修改代理服

2023-12-11 09:50:35

Linux定時器

2013-03-25 10:03:35

網(wǎng)絡(luò)優(yōu)化網(wǎng)絡(luò)抑制快速認(rèn)知網(wǎng)絡(luò)

2013-05-23 16:01:47

Android開發(fā)移動開發(fā)Chronometer

2010-01-06 15:35:01

.Net Framew

2010-01-13 16:45:44

VB.NET刪除控件

2010-01-11 15:31:04

VB.NET拖動窗體

2010-01-05 17:30:23

.NET Framew

2022-06-23 07:23:34

自定義組件計時器

2023-04-17 09:08:27

CSS計時器

2010-01-05 13:16:59

2010-01-06 18:33:56

.Net Framew

2010-01-05 17:59:54

.NET Framew
點贊
收藏

51CTO技術(shù)棧公眾號