2011-01-06 64 views
8

我對調度員有點困惑。假設我正在進行某種長時間操作的後臺線程。我想更新ui線程我明白我通過調度程序執行此操作。我的問題是,我是否像調用靜態調用Dispatcher:Dispatcher.BeginInvoke(mywork)...或者我想更新的控件上:mytextbox.Dispatcher.BeginInvoke(mywork)WPF /線程:Dispatcher static vs Dispatcher on a control?

回答

0

首先,我認爲理解,Dispatcher不是爲了處理大背景操作而設計的。它被設計爲在一個對象的UI線程上排隊工作。下面是有關.NET線程模型和Dispatcher一個有價值的MSDN文章:

話說實施Dispatcher.BeginInvoke方法的標準方法是調用它的控制:

startStopButton.Dispatcher.BeginInvoke(
    DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber) 
); 

希望有幫助!

14

值得注意的是,撥打Dispatcher.BeginInvoke不是靜態調用:這是一個隱含的this.Dispatcher.BeginInvoke。如果您可以使用此調用,那麼您可能已經從控件或窗口中編寫了代碼。在這種情況下,您可能是可能是,因爲大多數情況下每個應用程序都會有一個UI線程。

實際的靜態調用將是Dispatcher.CurrentDispatcher.BeginInvoke,這是而不是你想要調用的東西(請參閱我對哈桑汗的回答爲什麼的評論)。

編輯:調用Application.Current.Dispatcher壞事。 (並且,爲了清楚起見,它是一個實例屬性,而不是靜態 - 在Application的靜態/單例實例上調用。)此屬性將爲創建應用程序的線程返回Dispatcher,並且通常這是線程UI也在創建 - 因此Application.Current.Dispatcher返回與myWindow.Dispatcher相同的調度程序。

靜態調用Dispatcher.CurrentDispatcher(我警告過)會爲您調用的線程返回Dispatcher。如果你從後臺線程調用它,你會得到一個專門爲該線程創建的新Dispatcher - 這通常不是想要的。

+0

*爲什麼*正在使用`Application.Current.Dispatcher`壞主意?到目前爲止,我在應用程序中使用它並沒有任何問題。它只需要'Application()。Run()`被調用。 – Aphex 2011-02-23 15:49:04

0

雖然使用案件要麼DispatcherObject.Dispatcher(所有依賴對象和控件DispatcherObject繼承,等等)或Application.Current.Dispatcher是做正確的事,因爲這通常只有一個UI線程,可以有多個UI線程,不同的窗口可以使用不同的調度程序。在這種情況下,使用其調度程序更新控件很重要。它存儲在其Dispatcher屬性(從DispatcherObject繼承)中,此窗口中的任何其他控件和窗口本身。

相關問題