Dispatcher.CurrentDispatcher
(System.Windows.Threading
)和Application.Current.Dispatcher
(System.Windows
)之间有什么区别?
我的直觉告诉我Application.Current.Dispatcher
将永远不会更改,并且对于当前应用程序中的所有线程都是全局的,而Dispatcher.CurrentDispatcher
可能会创建Dispatcher
的新实例,具体取决于从哪个线程它被称为。
这是对的吗?
如果是,Dispatcher.CurrentDispatcher
的目的主要是多线程用户界面吗?
答案 0 :(得分:81)
我的直觉告诉我,Application.Current.Dispatcher永远不会改变 并且对于当前应用程序中的所有线程都是全局的 Dispatcher.CurrentDispatcher可以创建Dispatcher的新实例 取决于调用它的线程。
这是正确的。
此外,从非UI线程访问Dispatcher.CurrentDispatcher
没有任何意义。除非你调用Dispatcher.Run
,否则它将无效,并且进入无限消息循环并不是你想要在工作线程中做的事情。
所以:
在最常见的情况中,您的应用只有一个UI线程,来自UI线程的Application.Current.Dispatcher
和Dispatcher.CurrentDispatcher
将返回相同的实例。你使用哪一个只是一个偏好的问题。
如果您的应用有多个UI线程,那么每个DispatcherObject
都会有
永久关联在构建时创建的UI线程的调度程序。在这种情况下,Application.Current.Dispatcher
将引用应用程序生成的线程的调度程序;您将无法使用它将消息发布到其他UI线程拥有的控件。
答案 1 :(得分:18)
简单地说......
Dispatcher.CurrentDispatcher
获取当前线程的调度程序 。因此,如果您正在从后台流程中查找UI线程的调度程序,请不要使用此功能。
Application.Current.Dispatcher
将始终为您提供UI线程的调度程序,因为这是旋转唯一Application实例的线程。
答案 2 :(得分:8)
我的直觉告诉我,Application.Current.Dispatcher将永远不会更改并且对当前应用程序中的所有线程都是全局的,而Dispatcher.CurrentDispatcher可能会根据调用它的线程创建Dispatcher的新实例。
这是正确的,Application.Current.Dispatcher
是应用程序的实例属性,在构造时分配为当前线程的调度程序。正如Dispatcher.CurrentDispatcher
的文档指出:
获取当前正在执行的线程的Dispatcher,并创建一个新的Dispatcher(如果尚未与该线程关联)。
如果是,Dispatcher.CurrentDispatcher的目的主要是针对多线程UI吗?
可能,我没有遇到任何使用后台线程调度程序的用法,因为您通常没有属于他们的UI元素,您可能希望调度操作。