System.Windows.Forms.Timer、System.Timers.Timer、System.Threading.Timer的差別和分別什麼時候用

來源:互聯網
上載者:User

標籤:時間   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的差別和分別什麼時候用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.