我對調度員有點困惑。假設我正在進行某種長時間操作的後臺線程。我想更新ui線程我明白我通過調度程序執行此操作。我的問題是,我是否像調用靜態調用Dispatcher:Dispatcher.BeginInvoke(mywork)...或者我想更新的控件上:mytextbox.Dispatcher.BeginInvoke(mywork)WPF /線程:Dispatcher static vs Dispatcher on a control?
回答
首先,我認爲理解,Dispatcher
不是爲了處理大背景操作而設計的。它被設計爲在一個對象的UI線程上排隊工作。下面是有關.NET線程模型和Dispatcher
一個有價值的MSDN文章:
話說實施Dispatcher.BeginInvoke
方法的標準方法是調用它的控制:
startStopButton.Dispatcher.BeginInvoke(
DispatcherPriority.Normal, new NextPrimeDelegate(CheckNextNumber)
);
希望有幫助!
值得注意的是,撥打Dispatcher.BeginInvoke
不是靜態調用:這是一個隱含的this.Dispatcher.BeginInvoke
。如果您可以使用此調用,那麼您可能已經從控件或窗口中編寫了代碼。在這種情況下,您可能是可能是,因爲大多數情況下每個應用程序都會有一個UI線程。
實際的靜態調用將是Dispatcher.CurrentDispatcher.BeginInvoke
,這是而不是你想要調用的東西(請參閱我對哈桑汗的回答爲什麼的評論)。
編輯:調用Application.Current.Dispatcher
是不壞事。 (並且,爲了清楚起見,它是一個實例屬性,而不是靜態 - 在Application
的靜態/單例實例上調用。)此屬性將爲創建應用程序的線程返回Dispatcher,並且通常這是線程UI也在創建 - 因此Application.Current.Dispatcher
返回與myWindow.Dispatcher
相同的調度程序。
靜態調用Dispatcher.CurrentDispatcher
(我警告過)會爲您調用的線程返回Dispatcher。如果你從後臺線程調用它,你會得到一個專門爲該線程創建的新Dispatcher - 這通常不是想要的。
雖然使用最案件要麼DispatcherObject.Dispatcher
(所有依賴對象和控件DispatcherObject
繼承,等等)或Application.Current.Dispatcher
是做正確的事,因爲這通常只有一個UI線程,可以有多個UI線程,不同的窗口可以使用不同的調度程序。在這種情況下,使用其調度程序更新控件很重要。它存儲在其Dispatcher
屬性(從DispatcherObject
繼承)中,此窗口中的任何其他控件和窗口本身。
- 1. WPF Dispatcher拋出TargetInvocationException
- 2. control.BeginInvoke()VS Dispatcher VS SynchronizationContext VS. - 可靠性
- 3. webservice dispatcher
- 4. Variadic Template Dispatcher
- 5. Struts 2 dispatcher
- 6. Dispatcher和SynchronizationContext類
- 7. 要求去Struts Dispatcher
- 8. 關於WPF Dispatcher對象的困惑
- 9. $ Dispatcher = new Dispatcher(); // ImagesController無法找到控制器類
- 10. 有什麼辦法可以在非WPF線程上使用Dispatcher;新的多線程
- 11. Dispatcher-servlet.xml - 不是強制的?
- 12. .NET Dispatcher類缺失(System.Windows.Threading)
- 13. Symfony2 Event Dispatcher(理論上)
- 14. 哪些.NET組件使用Dispatcher?
- 15. WPF Dispatcher {「調用線程不能訪問這個對象,因爲一個不同的線程擁有它。」}
- 16. Dispatcher CheckAccess的用途是什麼?
- 17. 應該從Event Dispatcher或主線程控制Swing GUI應用程序嗎?
- 18. 說WPF具有Dispatcher類是什麼意思?
- 19. 在WPF中,MVVM模板中不需要Dispatcher嗎?
- 20. WPF中的Dispatcher對象有什麼用途?
- 21. static extern vs extern static
- 22. NullReferenceException @ Dispatcher和其他GUI問題
- 23. 如何在spring dispatcher servlet中配置jackson?
- 24. Windows上akka.io.pinned-dispatcher上的高CPU問題
- 25. 檢查來自客戶端的CQ Dispatcher
- 26. NameError:未初始化的常量ActionController :: Dispatcher
- 27. 在spring mvc項目中缺少dispatcher-servlet.xml
- 28. dispatcher-servlet和spring-servlet之間的區別
- 29. 未初始化的常量ActionController :: Dispatcher :: MiddlewareStack
- 30. Spring Multiple Multiple HttpSecurity with Multiple Dispatcher servlets
*爲什麼*正在使用`Application.Current.Dispatcher`壞主意?到目前爲止,我在應用程序中使用它並沒有任何問題。它只需要'Application()。Run()`被調用。 – Aphex 2011-02-23 15:49:04