Есть ли способ получить поток пользовательского интерфейса Dispatcher
, если у вас нет ссылки на какие-либо элементы пользовательского интерфейса?
Как я могу получить поток диспетчера пользовательского интерфейса?
Ответ 1
Вы можете захватить диспетчер интерфейса пользователя из экземпляра статического приложения: Application.Current.Dispatcher
Вы можете сначала проверить Application.Current
на null, поскольку его можно очистить во время последовательности выключения.
Ответ 2
Следующее работает намного лучше для меня при использовании в приложении WinForms, которое также использует WPF (в моем случае Esri Arcmap.exe)
private System.Windows.Threading.Dispatcher Dispatcher { get; set; }
// I put this in my view model constructor as it MUST be called from UI thread
Dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;
Другой метод (который включал вызов new System.Windows.Application()
для заполнения System.Windows.Application.Current
) вызывал проблемы для меня каждый раз, когда я открывал новое окно WPF, а затем закрывал его. Это не только исключило System.Windows.Application.Current
, но я больше не мог открывать новые окна, так как их методы InitializeComponents()
не работали с:
System.InvalidOperationException: 'Объект приложения закрывается.'
Пока что новое решение работает без этих побочных эффектов.
Ответ 3
Вызов свойства Dispatcher.CurrentDispatcher
позволит получить текущий экземпляр Dispatcher
потока или создать новый для потока, если он не существует.
using System.Windows.Threading;
Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
Это может быть нежелательно, если вы не хотите случайно создавать ненужные экземпляры Dispatcher
.
Вместо этого вы можете использовать метод Dispatcher.FromThread(Thread)
.
using System.Windows.Threading;
Dispatcher dispatcher = Dispatcher.FromThread(System.Threading.Thread.CurrentThread);
Этот метод получит экземпляр Dispatcher
из указанного потока. Если экземпляр Dispatcher
не существует для указанного потока, он вернет значение null
.