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.DispatcherDispatcher.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.DispatcherApplication.Current.Dispatcher的一个实例属性,它在构build时被指定为当前线程的调度程序。 正如Dispatcher.CurrentDispatcher的文档指出的那样:

获取当前正在执行的线程的Dispatcher,并创build一个新的Dispatcher(如果尚未与该线程关联)。


如果是这样,Dispatcher.CurrentDispatcher的目的主要是用于multithreadingUI吗?

也许,我没有遇到任何使用后台线程的调度程序,因为您通常没有属于他们的UI元素,您可能想要调度操作。