2010-02-13 134 views
21

請解釋「DispatcherTimer」和「定期定時」是@Kent Boogaart意味着使用一個多線程WPF應用程序如本主題任務sheduler之間的區別:DispatcherTimer VS在WPF應用程序定期定時器任務調度

Advice needed for multi-threading strategy for WPF application

在評論

到後(報價)之一:

- 如果所有的DispatcherTimer確實是開球另一個線程,什麼是使用DispatcherTimer點? ....那些線程並不需要在UI線程上啓動。你可以只使用一個普通定時器和避免中斷的UI完全

什麼是「定期定時」是指什麼?他們如何(「DispatcherTimer」和「常規計時器」)對UI的影響有何不同?

(直到閱讀這篇文章我想過DispatcherTimer如使用WPF計時器的自然方式。什麼情況下,當這是不是真的?)

回答

39

DispatcherTimer是普通計時器。它在UI線程上觸發它的Tick事件,你可以用UI來做任何你想要的事情。 System.Timers.Timer是一個異步計時器,它的Elapsed事件在一個線程池線程上運行。你必須在你的事件處理程序非常小心,你都不準碰任何UI組件或數據綁定變量。而且,只要您訪問在UI線程中使用的類成員,就需要使用鎖語句。

在鏈接的答案,因爲OP試圖故意異步運行代碼Timer類是比較合適的。

+0

注意,「接觸」包括設置MVVM視圖模型屬性,以便使用DispatcherTimer你沒事的時候,但有一個定時器,你甚至不能做到這一點 – 2012-09-15 04:19:44

26

Regular Timer的Tick事件實際上是在創建Timer的線程中觸發的,所以在tick事件中,爲了使用UI訪問任何內容,必須通過dispatcher.begininvoke進行操作,如下所述。

RegularTimer_Tick(object sender, EventArgs e) 
{ 
    txtBox1.Text = "count" + i.ToString(); 
    // error can not access 
    // txtBox1.Text property outside dispatcher thread... 

    // instead you have to write... 
    Dispatcher.BeginInvoke((Action)delegate(){ 
     txtBox1.Text = "count " + i.ToString(); 
    }); 
} 

在調度定時器的情況下,您可以訪問UI元素而不做開始調用或調用如下...

DispatcherTimer_Tick(object sender, EventArgs e) 
{ 
    txtBox1.Text = "Count " + i.ToString(); 
    // no error here.. 
} 

DispatcherTimer只是提供了方便了定期計時器可以方便地訪問UI對象。

+1

謝謝你的代碼示例,+1 – rem 2010-02-16 08:37:05

+0

是調度員計時器使用Invoke或BeginInvoke? – 2016-04-12 09:23:36

+0

基於這裏的來源,DispatcherTimer使用BeginInvoke的,原因是,調度隊列優先基於調用機制。 http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/Threading/DispatcherTimer.cs,d2a05f6b09eee858 – 2016-04-12 10:50:43

14

使用.NET 4.5,如果您需要使用新的.NET 4.5 await功能,則還可以爲您的計時器創建一個async委託。

 var timer = new DispatcherTimer(); 
     timer.Interval = TimeSpan.FromSeconds(20); 
     timer.Tick += new EventHandler(async (object s, EventArgs a) => 
     { 
      Message = "Updating..."; 
      await UpdateSystemStatus(false); 
      Message = "Last updated " + DateTime.Now;    
     }); 
     timer.Start(); 
+0

這也可能是感興趣的(我自己的問題尋求一個異步友好DispatcherTimer)http://stackoverflow.com /問題/ 12442622 /異步感知型-dispatchertimer - 包裝 - 子/ 12442719#12442719 – 2012-09-15 21:32:41

相關問題