我对调度员有点困惑。假设我正在进行某种长时间操作的后台线程。我想更新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