2010-09-07 92 views
1

調度計時器,在UI線程上的更新很方便 - 有一個問題......這會導致用戶界面凍結時間!WPF窗口實現ISynchronizeInvoke與System.Timers.Timer一起使用

因此,我想在System.Timers命名空間中使用Timer,它將實現相同的功能,除非UI將更加靈敏,因爲它會從不同的線程更新。

System.Timers.Timer需要一個SynchronisationObject,因此我想在我的WPF窗口上實現ISynchronizeInvoke。

有人可以幫助我理解如何去實現這一點,並驗證我的想法是否正確。

任何幫助,將不勝感激。

回答

3

那麼,直接回答這個問題:你不能只寫一個ISynchronizeInvoke的實現,它的構造函數接受Dispatcher,只是轉發所有的調用? Dispatcher API非常非常類似於ISynchronizeInvoke之一。

但是,我不認爲這是真正正確的答案 - 因爲給予TimerISynchronizeInvoke的一點是,它將使用它來封送到UI線程(或其他)。這會讓你和以前完全一樣。推測你有你想要在UI線程上執行而不是的工作......所以你不想傳遞ISynchronizeInvoke。只需使用普通計時器(或.NET 4並行擴展任務等),並使用Dispatcher.InvokeDispatcher.BeginInvoke僅用於需要更新UI(當然需要在UI線程上完成)的時間。

+0

嗨喬恩 感謝您的答覆。我目前沒有在定時器事件中運行任何UI代碼,但應用程序正在增長,我懷疑UI交互很快就會出現。發生這種情況時,我希望代碼繼續按原樣運行。 通過實現ISynchroniseInvoke,這是否意味着我不必調用我想操作的UI元素上的Dispatcher.Invoke和Dispatcher.BeginInvoke?如果是這樣,這是非常可取的 - 所以我真的很想實施ISynchronizeInvoke,但我不知道如何。 – c0D3l0g1c 2010-09-07 06:26:31

+0

@ c0D310g1:你錯過了我的觀點。如果你實現了'ISynchronizeInvoke',你就會有效地回到DispatcherTimer'解決方案中......你的所有代碼都將在UI線程上運行,所以它會再次凍結UI。如果你想在UI線程上運行定時任務,那就是'DispatcherTimer'的用處。但是你*不想爲長時間運行的任務做這件事,正因爲它鎖定了用戶界面。 – 2010-09-07 06:38:25

+0

這很有道理,謝謝! – c0D3l0g1c 2010-09-07 10:00:02