不論在客戶端應用程序還是服務器組件(包括窗口服務)定時器通常扮演一個重要的角色寫一個高效的定時器驅動型可管理代碼要求對程序流程有一個清晰的理解及掌握NET線程模型的精妙之處NET框架類庫提供了三種不同的定時器類SystemWindowsFormsTimer SystemTimersTimer 和SystemThreadingTimer每個類為不同的場合進行設計和優化本文章將研究這三個類並讓你理解如何及何時應該使用哪一個類
Microsoft? Windows?裡的定時器對象當行為發生時允許你進行控制定時器一些最常用的地方就是有規律的定時啟動一個進程在事件之間設置間隔及當進行 圖形工作時維護固定的動畫速度(而不管處理函數的速度)在過去對於使用Visual Basic?的開發者來說定時器甚至用來模擬多任務
正如你所期望的那樣對於你需要應對的不同場合微軟為你裝備了一些工具在NET框架類庫中有三種不同的定時器類SystemWindowsFormsTimerSystemTimersTimer和SystemThreadingTimer頭兩個類出現在Visual Studio? NET的工具箱窗口這兩個定時器控件都允許你直接把它們拖拽到Windows窗體設計器或組件類設計器上如果你不小心這就是麻煩的開始
Visual Studio NET工具箱上的Windows窗體頁和組件頁(見Figure )都有定時器控件非常容易的錯誤地使用它們當中的一個或者更糟糕的是根本意識不到它們的不同僅當目標是Windows窗體設計器時才使用Windows窗體頁上的定時器控件這個控件將在你的窗體上放置一個SystemsWindowsFormsTimer類的實例像工具箱上的其它控件一樣你可以讓Visual Studio NET處理其生成或者你自己手動的實例和初始化這個類
Figure 定時器控件
在組件頁上的定時器控件可以被安全的用在任何類中這個控件創建了一個SystemTimersTimer類的實例如果你正在使用Visual Studio NET工具箱無論是Windows窗體設計器還是組件類設計器你都可以安全的使用這個類在Visual Studio NET中當你設計一個派生於SystemComponentModelComponent的類時使用組件類設計器SystemThreadingTimer類不出現在Visual Studio NET工具箱窗口上它稍微有點復雜但提供了一個更高級別的控件稍後你會在本文章中看到
Figure 例子程序
讓我們首先研究SystemWindowsFormsTimer和SystemTimersTimer類這兩個類有著非常相似的對象模型稍後我將探索更加高級的SystemThreadingTimer類Figure 是我將在整個文章引用的例子程序的一個屏幕快照這個應用程序將會讓你獲得對這幾個定時器類的清晰的理解你可以從本文章的開始鏈接處下載完整的代碼並試驗它
System
Windows
Forms
Timer
如果你在找一個節拍器你已經走錯了地方了這個定時器類引發的定時器事件是同你的窗口應用程序的其余代碼相同步的這意味著正在執行的代碼從來不會被這個定時器類的實例所搶占(假設你不調用ApplicationDoEvents)就像一個典型窗體程序裡的其它代碼一樣任何駐留在一個定時器事件處理函數(指的是該類型的定時器類)中的代碼也是使用應用程序的UI線程所執行在空閒時候該UI線程同樣要對應用程序的窗體消息隊列中的所有消息進行負責這不僅包括由這個定時類引發的消息也包括窗體API消息無論何時你的程序不忙於做其它事情時該UI線程就處理這些消息
在Visual Studio NET之前如果你寫過Visual Basic代碼你可能知道在一個窗口應用程序裡當正在執行一個事件處理函數時讓你的UI線程去響應其它窗體消息的唯一方法就是調用ApplicationDoEvents方法就像Visual Basic一樣從NET框架中調用ApplicationDoEvents能夠產生許多問題ApplicationDoEvents產生了對UI消息泵的控制讓你對所有未處理的事件進行處理這能夠改變我剛才提到的所期望的執行路徑如果為了處理由該定時器類產生的定時器事件而在你的代碼中有一個ApplicationDoEvents的調用你的程序流程可能會被打斷這會產生不希望的行為並使調試困難
運行例子程序就會使這個定時器類的行為變得清楚單擊程序的Start按鈕接著單擊Sleep按鈕最後單擊Stop按鈕將會產生下面的輸出結果
System
Windows
Forms
Timer Started @
:
:
PM
> Timer Event
@
:
:
PM on Thread
UIThread
> Timer EVENT
@
:
:
PM on Thread: UIThread
> Timer Event
@
:
:
PM on Thread: UIThreadSleeping for
ms
> Timer Event
@
:
:
PM on Thread: UIThreadSystem
Windows
Forms
Timer Stopped @
:
:
PM
例子程序設置SystemWindowsFormsTimer類的間隔屬性為毫秒正如你所看到的當UI線程正在睡眠(秒)期間如果定時器事件處理函數仍然繼續捕捉定時器事件的話當睡眠線程再次被喚醒的時候應該有個定時器事件被顯示——在UI線程睡眠時每秒鐘一個然而當UI線程在睡眠時定時器卻保持掛起狀態
[] [] [] []
From:http://tw.wingwit.com/Article/program/net/201311/15306.html