標籤:時間 windows 執行 設定 介面 編程 推薦 ui線程 方法
一、System.Windows.Forms.Timer
1、基於Windows訊息迴圈,用事件方式觸發,在介面線程執行;是使用得比較多的Timer,Timer Start之後定時(按設定的Interval)調用掛接在Tick事件上的EvnetHandler。在這種Timer的EventHandler中可 以直接擷取和修改UI元素而不會出現問題--因為這種Timer實際上就是在UI線程自身上進行調用的。
2、它是一個基於Form的計時器
3、建立之後,你可以使用Interval設定Tick之間的跨度,用委託(delegate)hook Tick事件
4、調用Start和Stop方法,開始和停止
二、System.Timers.Timer
1. 用的不是Tick事件,而是Elapsed事件
2. 和System.Windows.Forms.Timer一樣,用Start和Stop方法
3. AutoReset屬性決定計時器是不是要發起一次事件然後停止,還是進入開始/等待的迴圈。System.Windows.Forms.Timer沒有這個屬性
三、System.Threading.Timer
1、用Threading.Timer時的方法,和前面就不太相同了,所以的參數全部在建構函式中進行了設定,而且可以設定啟動時間。而且沒有提供start和stop方法來控制計時器。而且是以一種回調方法的方式實現,而不是通過事件來實現的。他們之間還是有區別的。
2、我們只有銷毀掉對象來停止他。當你運行時,你會發現他和前面的Timers.Timer一樣,是多線程的,主要表現在不會假死,調試運行報錯。但跟讓你奇怪的是,我們的代碼竟然無法讓她停止下來。調用了Dispose方法沒有用。問題在那?然後有進行了測試,修改了間隔時間為100,200,500,1000,3000,4000。這幾種情況。發現當間隔為500ms以上是基本馬上就停止了。而間隔時間相對執行時間越短,繼續執行的時間越長。這應該是在間隔時間小於執行時間時多個線程運行造成的。因為所有的線程不是同時停止的。間隔越短,線程越多,所以執行次數越多。
3、System.Threading.Timer 是一個簡單的輕量計時器,它使用回調方法並由線程池線程提供服務。不建議將其用於 Windows 表單,因為其回調不在使用介面執行緒上進行。
http://space.itpub.net/12639172/viewspace-571197
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx
==================================================
System.Windows.Forms.Timer執行的時候,如果你在過程中間加一個sleep整個的介面就死掉了,
但是另外兩個沒有這個情況,System.Timers.Timer、System.Threading.Timer!
System.Timers.Timer、System.Threading.Timer這兩個平時用的時候沒有發現太大的區別,定時的精度都差不多。
一般我個人用的話,還是用的System.Threading.Timer比較多,用編程的方法比較好用!
System.Windows.Forms.Timer是基於UI的
System.Timers.Timer是基於服務
System.Threading.Timer是基於線程
除了Timer只能用於介面,其他的事在沒看出區別
System.Windows.Forms.Timer 還有 wpf那個timer 是單線程的 單次已耗用時間過長會影響下次觸發 精度差
System.Threading.Timer 都是多線程的 單次已耗用時間過長不會影響下次觸發
精度高
System.Threading.Timer 是一個簡單的輕量計時器,它使用回調方法並由線程池線程提供服務。不建議將其用於 Windows 表單,因為其回調不在使用介面執行緒上進行。System.Windows.Forms.Timer 是用於 Windows 表單的更佳選擇。要擷取基於伺服器的計時器功能,可以考慮使用 System.Timers.Timer,它可以引發事件並具有其他功能。
在《CLR Via C#》中講多線程時有提到這3個計時器,但作者說System.Timers.Timer是對System.Threading.Timer的報裝,不推薦使用,但是在我的WEB項目中的Application_Start中我還是使用的這個而不是Threading.Timer,因為使用Threading.Timer時只執行了一次就不在執行了。
對於計時器在B/S結構中的使用就複雜一些,一般我們把計時器放在Application_OnStart中,這樣全域維護一個計時器,可以進行定期備份資料庫,定期維護使用者等操作,而且方法寫作靜態,以免被記憶體回收。而不建議在一般的aspx頁面中使用,因為伺服器端的定時器對使用者這樣意義不大,完全可以使用JS代替。而且這個頁面的每個請求都可能引入一個新的定時器,導致系統崩潰。另外,定時器是ASP.NET進程,IIS有關,所以對用重要的執行任務,還是建議寫成服務或獨立程式放在伺服器上執行好了。
http://blog.itpub.net/12639172/viewspace-571197
System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差別和分別什麼時候用