講解定時器VB.NET System.Threading類
之前我們將了關于定時器System.Windows.Forms.Timer類的講解,今天我們大家來看和它類似的另一個VB.NET System.Threading 。這個定時器類來自System.Threading名字空間。我愿意說這是所有定時器類中最好的一個,但這會引起誤導。舉一個例子,我驚訝的發現對于駐留在VB.NET System.Threading名字空間的這個類天生就不是線程安全的。(很明顯,這不意味著它不能以線程安全的方式使用)。這個類的可編程接口同其它兩個類也不一致,它稍微有點麻煩。
不像我開始描述的兩個定時器類,VB.NET System.Threading有四個重載構造函數,就像下面這樣:
- public Timer(TimerCallback callback, object state, long dueTime, long period);
- public Timer(TimerCallback callback, object state, UInt32 dueTime, UInt32 period);
- public Timer(TimerCallback callback, object state, int dueTime, int period);
- public Timer(TimerCallback callback, object state, TimeSpan dueTime, TimeSpan period);
第一個參數(callback)要求一個TimerCallback的委托,它指向一個方法,該方法具有下面的結構:
- public void TimerCallback(object state);
第二個參數(state)可以為空或者是包含程序規范信息的對象。在每一個定時器事件被調用時該state對象作為一個參數傳遞給你的定時回調函數。記住定時回調功能是在一個工作者線程上執行的,所以你必須確保訪問state對象的線程安全。
第三個參數(dueTime)讓你定義一個引發初始定時器事件的時間。你可指定一個0立即開始定時器或者阻止定時器自動的開始,你可以使用VB.NET System.Threading.Timeout.Infinite常量。
第四個參數(period)讓你定義一個回調函數被調用的時間間隔(毫秒)。給該參數定義一個0或者Timeout.Infinite可以阻止后續的定時器事件調用。
一旦構造函數被調用,你仍然可以通過Change方法改變dueTime和period。該方法有下面四種重載形式:
- public bool Change(int dueTime, int period);public bool Change(uint dueTime, uint period);
- public bool Change(long dueTime, long period);public bool Change(TimeSpan dueTime, TimeSpan period);
下面是我在例子程序中用到的開始和停止該定時器的代碼:
- //Initialize the timer to not start automatically...System.Threading.Timer tmrThreadingTimer = newSystem.Threading.
Timer(new TimerCallback(tmrThreadingTimer_TimerCallback), null, System.Threading.Timeout.Infinite, 1000);- //Manually start the timer...tmrThreadingTimer.Change(0, 1000);
- //Manually stop the timer...tmrThreadingTimer.Change(Timeout.Infinte, Timeout.Infinite);
正如你所期望的那樣,通過選擇VB.NET System.Threading.Timer類運行例子程序會產生同你看到的System.Timers.Timer類一樣的輸出結果。因為TimerCallback功能也是在工作者線程上被調用,沒有一個跳動被跳過(假設有工作者線程可用)。Figure 5顯示了例子程序的輸出結果。
不像System.Timers.Timer類,沒有與SynchronizingObject相對應的屬性被提供。任何請求訪問UI控件的操作都必須通過控件的Invoke或BeginInvoke方法被列集
【編輯推薦】