Диспетчер.CurrentDispatcher и приложения.Текущий.Диспетчер
в чем разница между Dispatcher.CurrentDispatcher
(in System.Windows.Threading
) и Application.Current.Dispatcher
(in System.Windows
)?
моя интуиция говорит мне, что Application.Current.Dispatcher
никогда не изменится, и является общим для всех потоков в текущем приложении, в то время как Dispatcher.CurrentDispatcher
может создать новый экземпляр Dispatcher
в зависимости от потока, из которого она была вызвана.
это правильно?
если это так, то цель Dispatcher.CurrentDispatcher
в первую очередь для многопоточных пользовательского интерфейса?
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 в первую очередь для многопоточного пользовательского интерфейса?
возможно, я не сталкивался с какой-либо пользой в получении диспетчера фонового потока, поскольку у вас обычно нет принадлежащих им элементов пользовательского интерфейса, к которым вы можете захотеть диспетчерские операции.