三種時間人《.NET中的Timer(3)》

第三種Timer就是System.Threading.Timer﹝以下簡稱為Threading.Timer﹞,和前兩個Timer不同的是,Threading.Timer是使用回呼﹝Callback﹞方式而非使用事件﹝Event﹞來執行其工作,在MSDN文件庫中的System.Threading命名空間中的[Timer 成員]可以看到這個類別是不具備事件的。

      第三種Timer就是System.Threading.Timer﹝以下簡稱為Threading.Timer﹞,和前兩個Timer不同的是,Threading.Timer是使用回呼﹝Callback﹞方式而非使用事件﹝Event﹞來執行其工作,在MSDN文件庫中的System.Threading命名空間中的[Timer 成員]可以看到這個類別是不具備事件的。在System.Threading命名空間中的[Timer 建構函式]可以看的出來這種Timer使用[TimerCallback 委派]來委派一個方法給予Threading.Timer來呼叫,如果要使用包含State Object的建構函式,可以參考[回呼的秘密花園]一文中關於State Object的介紹。所以在這篇文章中範例程式的開頭就是先建立一個Threading.Timer的執行個體,並且委派一個方法給這個執行個體:

Dim ThreadTimer As New System.Threading.Timer(AddressOf ThreadTimerProc02)

       Threading.Timer和System.Timers.Timer一樣屬於多執行緒形態的時間人,但是System.Timers.Timer可以使用SynchronizingObject屬性來使得我們可以不需要以委派的方法在程序中處理畫面中的控制項,因此當Threading.Timer所執行的程序要呼叫到畫面控制項時,就一定得用委派的方法處理不可;事實上,Threading.Timer類別只具備了建構函式與方法,表面上看起來的構造極為簡單,我想這就是為何在MSDN文件庫中會稱其為「簡單的輕量計時器」﹝詳見[三種時間人《.NET中的Timer(1)]中的伺服器計時器、Windows 計時器和執行緒計時器﹞。

      System.Timers.Timer與Windows.Forms.Timer使用Interval屬性來設定時間的間隔,而Threading.Timer的時間間隔則是在[Timer.Change 方法]中以傳入參數的方式表示。Threading.Timer.Change包含了四個多載,但不論哪一個多載,其第一個參數代表的是「變更開始的時間﹝dueTime﹞」;第二個參數則是代表「計時器的方法引動過程之間的時間間隔﹝period﹞」。

       1.dueTime:指的是當執行Timer.Change方法後延遲多久時間將會執行第一次的呼叫﹝以上面的範例就是呼叫ThreadTimerProc02方法﹞。當這個值為Infinite常數時﹝這個值其實就等於 -1﹞,意謂著無限期延遲等待,也就是將永遠不會執行呼叫。

       2.period:指的是在Timer.Chang中的程序已被執行過一次之後,間隔多久時間再執行下一次所呼叫的方法。當這個值為Infinite常數時﹝這個值其實就等於 -1﹞或是0時,意謂著不會有下一次的呼叫﹝有點類似在System.Timers.Timer中將AutoReset屬性設定為False一般﹞。

       關於整個範例程式的操作其實和先前的相關文章差不多,我想就不要浪費篇幅介紹,有興趣的網友可以自行下載範例程式玩一玩。範例程式是以VB2005撰寫的,請點選以下超連結下載:ThreadTimerTest.rar