ken*_*ken 72 .net wpf dispatcher
Dispatcher.CurrentDispatcher(in System.Windows.Threading)和Application.Current.Dispatcher(in System.Windows)之间有什么区别?
我的直觉告诉我,Application.Current.Dispatcher永远不会改变,并且对当前应用程序中的所有线程都是全局的,同时Dispatcher.CurrentDispatcher可能会Dispatcher根据调用它的线程创建一个新实例.
那是对的吗?
如果是,Dispatcher.CurrentDispatcher主要用于多线程UI 的目的是什么?
Jon*_*Jon 88
我的直觉告诉我,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线程拥有的控件.
小智 19
简而言之...
Dispatcher.CurrentDispatcher获取当前线程的调度程序.因此,如果您正在从后台进程中查找UI线程的Dispatcher,请不要使用它.
Application.Current.Dispatcher 将始终为您提供UI线程的调度程序,因为这是旋转唯一Application实例的线程.
我的直觉告诉我,Application.Current.Dispatcher将永远不会更改并且对当前应用程序中的所有线程都是全局的,而Dispatcher.CurrentDispatcher可能会根据调用它的线程创建Dispatcher的新实例.
这是正确的,它Application.Current.Dispatcher是应用程序的实例属性,在构造时分配给当前线程的调度程序.并且作为Dispatcher.CurrentDispatcher指出的文件:
获取当前正在执行的线程的Dispatcher,并创建一个新的Dispatcher(如果尚未与该线程关联).
如果是,Dispatcher.CurrentDispatcher的目的主要是针对多线程UI吗?
可能,我在获取后台线程的调度程序时没有遇到任何用处,因为您通常没有属于它们的UI元素,您可能希望分派操作.