Dispatcher.CurrentDispatcher与Application.Current.Dispatcher

时间:2012-05-04 12:40:07

标签: .net wpf dispatcher

Dispatcher.CurrentDispatcherSystem.Windows.Threading)和Application.Current.DispatcherSystem.Windows)之间有什么区别?

我的直觉告诉我Application.Current.Dispatcher将永远不会更改,并且对于当前应用程序中的所有线程都是全局的,而Dispatcher.CurrentDispatcher可能会创建Dispatcher的新实例,具体取决于从哪个线程它被称为。

这是对的吗?

如果是,Dispatcher.CurrentDispatcher的目的主要是多线程用户界面吗?

3 个答案:

答案 0 :(得分:81)

  

我的直觉告诉我,Application.Current.Dispatcher永远不会改变   并且对于当前应用程序中的所有线程都是全局的   Dispatcher.CurrentDispatcher可以创建Dispatcher的新实例   取决于调用它的线程。

这是正确的。

此外,从非UI线程访问Dispatcher.CurrentDispatcher没有任何意义。除非你调用Dispatcher.Run,否则它将无效,并且进入无限消息循环并不是你想要在工作线程中做的事情。

所以:

  • 在最常见的情况中,您的应用只有一个UI线程,来自UI线程的Application.Current.DispatcherDispatcher.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元素,您可能希望调度操作。