When WPF application starts, it actually creates two threads automatically. One is Rendering Thread, which is hidden from the programmer, so you cannot use the rendering thread directly from your program; while the other is Dispatcher Thread, which actually holds all the UI elements. So in other words, you might say Dispatcher is actually the UI thread which ties all the elements created within the WPF application. Conversely, WPF requires all the UI elements to be tied with Dispatcher thread, this is called Thread Affinity. Thus you cannot change any element created on Dispatcher
thread from any other threads, thus it follows the same Win32 based APIs. Thus it allows you to inter-operate any WPF component into HWND
based API. For more, read this. [^]
Dispatcher
is a class that handles thread affinity. It is actually a prioritized message loop through which all elements are channeled through. Every UIElement
is derived from DispatcherObject
which defines a property called Dispatcher
which points to the UI thread. Thus from any other thread, if you want to invoke or access UI component, you need to Invoke using Dispatcher
thread. DispatcherObject
actually has two chief duties, to check and verify if the thread has access to the object.