講解定時(shí)器VB.NET System.Threading類
之前我們將了關(guān)于定時(shí)器System.Windows.Forms.Timer類的講解,今天我們大家來(lái)看和它類似的另一個(gè)VB.NET System.Threading 。這個(gè)定時(shí)器類來(lái)自System.Threading名字空間。我愿意說(shuō)這是所有定時(shí)器類中最好的一個(gè),但這會(huì)引起誤導(dǎo)。舉一個(gè)例子,我驚訝的發(fā)現(xiàn)對(duì)于駐留在VB.NET System.Threading名字空間的這個(gè)類天生就不是線程安全的。(很明顯,這不意味著它不能以線程安全的方式使用)。這個(gè)類的可編程接口同其它兩個(gè)類也不一致,它稍微有點(diǎn)麻煩。
不像我開(kāi)始描述的兩個(gè)定時(shí)器類,VB.NET System.Threading有四個(gè)重載構(gòu)造函數(shù),就像下面這樣:
- 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);
第一個(gè)參數(shù)(callback)要求一個(gè)TimerCallback的委托,它指向一個(gè)方法,該方法具有下面的結(jié)構(gòu):
- public void TimerCallback(object state);
第二個(gè)參數(shù)(state)可以為空或者是包含程序規(guī)范信息的對(duì)象。在每一個(gè)定時(shí)器事件被調(diào)用時(shí)該state對(duì)象作為一個(gè)參數(shù)傳遞給你的定時(shí)回調(diào)函數(shù)。記住定時(shí)回調(diào)功能是在一個(gè)工作者線程上執(zhí)行的,所以你必須確保訪問(wèn)state對(duì)象的線程安全。
第三個(gè)參數(shù)(dueTime)讓你定義一個(gè)引發(fā)初始定時(shí)器事件的時(shí)間。你可指定一個(gè)0立即開(kāi)始定時(shí)器或者阻止定時(shí)器自動(dòng)的開(kāi)始,你可以使用VB.NET System.Threading.Timeout.Infinite常量。
第四個(gè)參數(shù)(period)讓你定義一個(gè)回調(diào)函數(shù)被調(diào)用的時(shí)間間隔(毫秒)。給該參數(shù)定義一個(gè)0或者Timeout.Infinite可以阻止后續(xù)的定時(shí)器事件調(diào)用。
一旦構(gòu)造函數(shù)被調(diào)用,你仍然可以通過(guò)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);
下面是我在例子程序中用到的開(kāi)始和停止該定時(shí)器的代碼:
- //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);
正如你所期望的那樣,通過(guò)選擇VB.NET System.Threading.Timer類運(yùn)行例子程序會(huì)產(chǎn)生同你看到的System.Timers.Timer類一樣的輸出結(jié)果。因?yàn)門(mén)imerCallback功能也是在工作者線程上被調(diào)用,沒(méi)有一個(gè)跳動(dòng)被跳過(guò)(假設(shè)有工作者線程可用)。Figure 5顯示了例子程序的輸出結(jié)果。
不像System.Timers.Timer類,沒(méi)有與SynchronizingObject相對(duì)應(yīng)的屬性被提供。任何請(qǐng)求訪問(wèn)UI控件的操作都必須通過(guò)控件的Invoke或BeginInvoke方法被列集
【編輯推薦】