2010-07-05 44 views
3

我見過的一些代碼示例,其中故事板被用作定時器,如:使用Storyboard作爲定時器有什麼意義?

void Update() 
    { 
     if (_sb == null) 
     { 
      _sb = new Storyboard(); 
      _sb.Completed += _sb_Completed; 
      _sb.Duration = new Duration(TimeSpan.FromSeconds(1)); 
     } 
     if (_sb_completed) 
     { 
      _sb.Begin(); 
      _sb_completed = false; 
     } 
    } 
    void _sb_Completed(object sender, EventArgs e) 
    { 
     PerformUpdate(); 
     _sb_completed = true; 
    } 

是故事板在某些時候比定時器更好?爲什麼人們使用它?

P.S.問題與Silverlight和/或WPF有關。

+0

你經常看到這個嗎?對我來說似乎很奇怪,也許這只是開發人員不瞭解DispatcherTimer或其他東西的那些東西? – Mark 2010-07-05 09:56:13

+1

使用故事板作爲定時器是從SL2時代開始的。現在不應該有任何理由以這種方式使用它。 – Denis 2010-07-07 07:43:06

回答

3

故事板,就像DispatcherTimer一樣,在UI線程上運行。因此,在任何情況下,您都不會看到交叉線程異常。

您可以通過DispatcherTimer使用Storyboard,因爲Storyboard具有更高的優先級。

但我不知道Timer對象本身,因爲我從來沒有真正使用它支持故事板或DispatcherTimer。

2

使用Storyboard與使用標準System.Threading.Timer不同。 Storybroad在主線程上運行,因此Completed甚至可以操作UI元素而不會出現交叉線程異常。標準Timer回調不會在UI線程上運行,因此需要額外的幫助來操作UI元素。

然而,正如馬克指出,如果真的需要的是延遲,那麼DispatcherTimer將是更直觀的選擇。與DispatcherTimer的區別在於它的設計是定期調用Tick事件,而Storyboard最多隻會在Begin的每次調用中最多撥打Completed一次。 A DispatcherTimer可以通過在第一個Tick事件發生時調用它的Stop方法以這種方式使用。

相關問題