Диспетчер.CurrentDispatcher и приложения.Текущий.Диспетчер


в чем разница между Dispatcher.CurrentDispatcher (in System.Windows.Threading) и Application.Current.Dispatcher (in System.Windows)?

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

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

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

3 66

3 ответа:

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

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

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

так:

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

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

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

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

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

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

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

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


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

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