85

Dispatcher.CurrentDispatcher(in System.Windows.Threading) 和Application.Current.Dispatcher(in )有什么区别System.Windows

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

那是对的吗?

如果是,Dispatcher.CurrentDispatcher主要是为了多线程UI的目的吗?

4

3 回答 3

104

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

那是对的。

Dispatcher.CurrentDispatcher此外,从非 UI 线程访问没有任何意义。除非您调用它,否则它将什么也不做Dispatcher.Run,并且进入无限消息循环不是您想要从工作线程中执行的操作。

所以:

  • 在最常见的情况下,您的应用程序只有一个 UI 线程,Application.Current.Dispatcher并且Dispatcher.CurrentDispatcher从 UI 线程内部将返回相同的实例。您使用哪一个只是偏好问题。

  • 如果您的应用程序有多个 UI 线程,那么每个线程都DispatcherObject将与在构建时创建的 UI 线程的调度程序永久关联。在这种情况下,Application.Current.Dispatcher将指派生您的应用程序的线程的调度程序;您将无法使用它向其他 UI 线程拥有的控件发布消息。

于 2012-05-04T13:02:09.727 回答
22

简而言之...

Dispatcher.CurrentDispatcher获取当前线程的调度程序。因此,如果您正在从后台进程中寻找 UI 线程的 Dispatcher,请不要使用它。

Application.Current.Dispatcher将始终为您提供 UI 线程的调度程序,因为这是启动唯一应用程序实例的线程。

于 2014-04-30T12:11:29.847 回答
9

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

没错,Application.Current.Dispatcher它是应用程序的实例属性,在构造时分配为当前线程的调度程序。正如文件Dispatcher.CurrentDispatcher指出的那样:

获取当前正在执行的线程的 Dispatcher,如果尚未与线程关联,则创建一个新的 Dispatcher。


如果是,Dispatcher.CurrentDispatcher 的目的是否主要用于多线程 UI?

可能,我在获取后台线程的调度程序方面没有遇到任何用处,因为您通常没有属于您可能想要调度操作的 UI 元素。

于 2012-05-04T12:50:25.267 回答