Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher

В чем разница между Dispatcher.CurrentDispatcherSystem.Windows.Threading) и Application.Current.DispatcherSystem.Windows)?

Моя кишка говорит мне, что Application.Current.Dispatcher никогда не изменится и будет глобальным для всех потоков в текущем приложении, а Dispatcher.CurrentDispatcher может создать новый экземпляр Dispatcher в зависимости от потока, из которого он был вызван.

Правильно ли это?

Если это так, является ли цель Dispatcher.CurrentDispatcher главным образом для многопоточного интерфейса?

Ответ 1

Моя кишка говорит мне, что Application.Current.Dispatcher никогда не изменится и является глобальным для всех потоков в текущем приложении, тогда как Dispatcher.CurrentDispatcher может создать новый экземпляр Диспетчера в зависимости от потока, из которого он был вызван.

Это правильно.

Кроме того, нет никакого смысла в доступе к Dispatcher.CurrentDispatcher из потока, отличного от UI. Он ничего не сделает, если вы не назовете Dispatcher.Run, и переход в бесконечный цикл сообщений - это не то, что вы хотите делать из рабочих потоков.

Итак:

  • В наиболее распространенном сценарии, где ваше приложение имеет только один поток пользовательского интерфейса, Application.Current.Dispatcher и Dispatcher.CurrentDispatcher из потока пользовательского интерфейса возвратит тот же экземпляр. Какой из них вы используете, это просто вопрос предпочтения.

  • Если ваше приложение имеет более одного потока пользовательского интерфейса, то каждый DispatcherObject будет постоянно связанный с диспетчером нити пользовательского интерфейса, он был создан при построении. В этом случае Application.Current.Dispatcher будет ссылаться на диспетчера потока, к которому была применена ваша заявка; вы не сможете использовать его для публикации сообщений на элементы управления, принадлежащие другим вашим потокам пользовательского интерфейса.

Ответ 2

Проще говоря...

Dispatcher.CurrentDispatcher получает диспетчер для текущего потока. Итак, если вы ищете Диспетчер потоков пользовательского интерфейса из фонового процесса, не используйте это.

Application.Current.Dispatcher всегда даст вам диспетчер потоков пользовательского интерфейса, так как это поток, который закручивает единственный экземпляр приложения.

Ответ 3

Мой кишок говорит мне, что Application.Current.Dispatcher никогда не изменится и будет глобальным для всех потоков в текущем приложении, а Dispatcher.CurrentDispatcher может создать новый экземпляр Диспетчера в зависимости от потока, из которого он был вызван.

Правильно, Application.Current.Dispatcher - это свойство экземпляра приложения, которое при построении назначается диспетчером текущего потока. И как указывает документация Dispatcher.CurrentDispatcher:

Получает диспетчер для текущего потока и создает новый диспетчер, если он еще не связан с потоком.


Если это так, является целью Dispatcher.CurrentDispatcher в первую очередь для многопоточного интерфейса?

Возможно, я не сталкивался с каким-либо использованием при получении диспетчера фонового потока, поскольку у вас обычно нет пользовательских интерфейсов, к которым вы можете отправлять операции.