How do I get the UI thread's Dispatcher?

38,159

Solution 1

You can grab the UI Dispatcher from the static application instance: Application.Current.Dispatcher

You may want to check Application.Current for null first, as it can be cleared during a shutdown sequence.

Solution 2

The following works much better for me when being used in a WinForms application that happens to be also using WPF (in my case Esri's 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;

The other method (which involved calling new System.Windows.Application() to populate System.Windows.Application.Current) caused issues for me every time I opened a new WPF window and then closed it. Not only did this null out System.Windows.Application.Current, but I could no longer open up new windows as their InitializeComponents() methods, all failed with:

System.InvalidOperationException: 'The Application object is being shut down.'

So far the new solution is working without those side effects.

Share:
38,159
Raven
Author by

Raven

https://github.com/AnderssonPeter

Updated on July 09, 2020

Comments

  • Raven
    Raven almost 4 years

    Is there any way to get the UI thread's Dispatcher when you have no reference to any UI elements?