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