Dispatcher.CurrentDispatcher
(位于System.Windows.Threading
)和Application.Current.Dispatcher
(位于System.Windows
)之间有什么区别呢?我的理解是Application.Current.Dispatcher
不会改变且适用于当前应用程序中的所有线程,而Dispatcher.CurrentDispatcher
根据调用它的线程可能会创建一个Dispatcher
实例。这个理解正确吗?如果正确,那么Dispatcher.CurrentDispatcher
的主要目的是用于多线程UI吗?
Invoke
和相关方法通常会将一个方法调用“打包”(如果您愿意,也可以称为序列化)为一个Win32消息,并将其发布到消息队列中。最终,消息循环(分派循环)会从消息队列中提取该消息并执行该调用。由于没有分派循环(如果您在该循环中,那么您的代码不会运行),因此调用实际上永远不会发生。因此,我认为Invoke
首先检查是否已经在CurrentDispatcher
线程中作为一种优化方式,如果是,则立即在该处执行调用,而不进行序列化。您可以通过检查Thread.ManagedThreadId
来验证这一点。 - Jon