Как я могу получить поток диспетчера пользовательского интерфейса?

Есть ли способ получить поток пользовательского интерфейса 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.