Как я могу получить Диспетчер потока пользовательского интерфейса? - PullRequest
49 голосов
/ 18 апреля 2010

Есть ли способ получить Dispatcher потока пользовательского интерфейса, когда у вас нет ссылок на какие-либо элементы пользовательского интерфейса?

Ответы [ 2 ]

92 голосов
/ 20 апреля 2010

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

Вы можете сначала проверить Application.Current на ноль, поскольку его можно очистить во время последовательности выключения.

1 голос
/ 11 декабря 2018

Следующее работает намного лучше для меня, когда я использую его в приложении WinForms, которое также использует WPF (в моем случае Arcri.exe от Esri)

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: 'Объект приложения находится выключи. '

Пока новое решение работает без этих побочных эффектов.

...