Dispatcher.CurrentDispatcher против Application.Current.Dispatcher

Каковы различия между Dispatcher.CurrentDispatcherSystem.Windows.Threading) а также Application.Current.DispatcherSystem.Windows)?

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

Это верно?

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

3 ответа

Решение

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

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

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

Так:

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

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

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

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

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

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

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

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


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

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

Другие вопросы по тегам