2012-10-19 104 views

回答

6

Windows.Forms.Timer的主要便利在於它的事件是在UI(Winforms)線程中觸發的。如果您的計時器事件執行UI操作,則可能是最簡單的替代方法(而不是在所有事件中調用Control.Invoke/BeginInvokeSynchronizationContext.Post/Send)。

+0

你說得對,這很簡單,但使用'SynchronizingObject'實現同樣的事情有多困難?特別是當與更簡單的計時器固有的「地雷」相比時? – ih8ie8

+2

閱讀所有答案後,我傾向於最贊同您的答案:*簡單* *的簡單編碼。但是,如果我想在事件處理程序中添加一些耗時的非GUI處理工作......我得到了一個「定時炸彈」(雙關語:) – ih8ie8

+0

@ ih8ie8 - 使用'SynchronizationContext'非常簡單:for例如,你可以用'_context = SynchronizationContext.Current'之類的東西將它緩存在窗體的構造函數中,然後在事件處理程序中調用'_contex.Post/Send(...)'。也就是說,不需要那麼做甚至更簡單:)當然,您對於非GUI非長時間工作的評論是當之無愧的。 –

4

Windows.Forms.Timer具有設計器支持。所以它的行爲就像其他Winforms組件一樣(即你可以將它拖到表單上,它是Controls集合的一部分,等等)。

System.Windows.Forms.Timer類引發的計時器事件與您Windows窗體應用程序中的其他代碼同步。這意味着正在執行的應用程序代碼永遠不會被此計時器類的實例搶佔(假設您不呼叫Application.DoEvents)。 Windows.Forms.Timer類觸發的事件與您的Winform控件兼容;您無需致電Invoke()即可安全地與其進行交互。

System.Timers.Timer類是一個基於服務器的計時器,設計和優化用於多線程環境。此計時器類的實例可以安全地從多個線程訪問。儘管在技術上需要Invoke()與Winforms進行交互,但Timer類確實提供了一個SynchronizingObject屬性,您可以將該屬性附加到您希望與之安全交互的Windows窗體。

這裏更多: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

+0

但是'Timers.Timer'也可以以同樣的方式被拖放,甚至爲你處理一個SynchronizingObject屬性......所以,爲什麼使用'Windows.Forms.Timer'框架提供了一個更優越的?也許CPU效率? – ih8ie8

+0

在所有的差異中,我會說最重要的是在與Winform相同的線程上調用'Systems.Windows.Forms.Timer'。它對於有用的東西非常方便,例如定期更新表單上的控件。如果你需要的只是皮卡車,你不會開車去上班。 –

0

我的信念是,這是WinForm設計整合,你可以將它拖動到窗體上,單擊它,在屬性窗格中設置其屬性。

+0

但是'Timers.Timer'也可以以同樣的方式被拖放,甚至爲你處理'SynchronizingObject'屬性... – ih8ie8

6

Windows.Forms.Timer事件在UI線程上被調用,因此您可以直接從事件處理程序更新UI,Timers.Timer(正常情況下會出現跨線程訪問衝突異常)通常不會。

而@羅伯特哈維answered,它也有設計師的支持。

+2

結論是:如果你需要操縱GUI,你最好使用這個這非常簡單,並且不需要使用invoke。 –

+1

@AlvinWong - 我會說它是簡單的使用它的簡單場景。 – Oded

+0

@AlvinWong你可以在沒有它的情況下使用另一個計時器,但它更簡單,更簡單,並且需要更少的樣板代碼。通過相同的邏輯,如果你不希望進入UI線程,你總是可以在窗體計時器中啓動一個後臺線程,這隻會造成浪費。 – Servy

4

Windows.Forms的優點之一是它在GUI的同一線程中運行,並且在訪問表單控件時不會遇到交叉線程異常。

3

嗯,我想答案是,他們是兩種完全不同類型的計時器。 Windows.Forms.Timer是一個單線程應用程序計時器,非常適合運行應用程序的客戶端上存在的計時器。

定時器用於在用戶定義的時間間隔內引發事件。此Windows計時器專用於UI線程用於執行處理的單線程環境。它要求用戶代碼具有可用的UI消息泵,並始終從同一線程運行,或將該調用編組到另一個線程。

相比之下,Timers.Timer是基於服務器的計時器,更適合Windows服務。

Timer組件是一個基於服務器的計時器,它允許您指定應用程序中引發Elapsed事件的重複間隔。然後,您可以處理此事件以提供定期處理。例如,假設您有一臺關鍵服務器必須每週7天,每天24小時持續運行。您可以創建一個使用定時器定期檢查服務器並確保系統已啓動並運行的服務。如果系統沒有響應,該服務可能會嘗試重新啓動服務器或通知管理員。

你可以找到他們的文檔,並閱讀微軟的摘錄和更多。

這不是一個永遠不應該使用或總是使用,服務兩個不同的目的。