Dispatcher
- внутренняя очередь сообщений WPF для основного потока пользовательского интерфейса.Его можно использовать из фонового потока для запуска команд в основном потоке пользовательского интерфейса приложения.
Это важно, потому что WPF не позволяет вам получать доступ к объектам, которые были созданы в других потоках.Например, если кнопка создается в главном потоке пользовательского интерфейса, вы не можете изменить эту кнопку из другого потока, но вы можете использовать Диспетчер из другого потока, чтобы отправить команду в основной поток пользовательского интерфейса для обновления кнопки.
Это относится ко всем объектам, а не только к элементам пользовательского интерфейса.Если в одном потоке создается что-то вроде ObservableCollection
, другой поток не может его изменить.По этой причине все объекты обычно создаются в основном потоке пользовательского интерфейса.
Сообщения диспетчера могут обрабатываться синхронно или асинхронно.Например,
// Will execute SomeMethod on the main UI thread synchronously
Dispatcher.Invoke(SomeMethod);
// Will execute SomeMethod on the main UI thread asynchronously
Dispatcher.BeginInvoke(SomeMethod);
Диспетчер также имеет разные очереди для разных приоритетов сообщений, и вы можете указать DispatcherPriority в своем сообщении, чтобы что-то выполнялось в указанное время.
// Will execute SomeMethod on the main UI thread synchronously,
// at the same priority as Rendering controls
Dispatcher.Invoke(DispatcherPriority.Render, SomeMethod);
// Will execute SomeMethod on the main UI thread asynchronously,
// at the same priority as background processes
Dispatcher.BeginInvoke(DispatcherPriority.Background, SomeMethod);