1. 程式人生 > >【原創】C#的定時器使用詳解

【原創】C#的定時器使用詳解

定時器是程式開發中必不可少的一員,無論是微控制器/ARM,還是上位機,理清不同的定時器之間的差異可以避免進坑~ 那麼我們就來分析分析C#中常見的三種定時器:

  1. Windows.Form.Timer 在這裡插入圖片描述 首先我們使用這個系統定時器,間隔設定為200ms。

  2. Threading.Timer 在這裡插入圖片描述 在button1事件裡定義了兩個執行緒定時器,非同步回撥的週期為200ms。

  3. 執行緒+延時 在這裡插入圖片描述 線上程中使用while(true)+sleep(200)的方式,理論上也是週期200ms。

這三種定時器的使用時比較簡單的,但是他們之間的差異在哪裡呢?我們使用richtextbox來列印在定時器裡輸出的資訊。 首先比較1和2: 在button1中啟動執行緒定時器和系統定時器,執行 在這裡插入圖片描述

結果是執行緒定時器裡的123456和系統定時器裡的abcdef之間沒有被打亂。 再來比較1和3: 在button1中啟動執行緒定時器和”while(true)+sleep(200)“,執行 在這裡插入圖片描述 結果是執行緒方法1中的123456和方法3中的abcdef之間被打亂,是由於執行緒之間的切換導致的。 其他的比較大家可以自己試一試看。

敲重點:這裡想說的問題是,實際專案中使用定時器,必須要看自己在定時器裡幹什麼處理,比如同步取樣資料(注意是同步操作),那麼使用執行緒定時器可能會出問題,因為在發出取樣資料的命令時,可能(有一定的概率)正好被執行緒切換,會引發TIMEOUT異常,而使用系統定時器(方法2)就不會出問題,因為在執行定時取樣的過程中不會被其他執行緒中斷。 另外,即使提高取樣資料的執行緒的優先順序,也避免不了TIMEOUT異常。

PS:第一次發部落格,難免有疏忽之處,若有錯誤請提出,大家一起討論,不斷提高~堅持每週更原創博!