There are two kinds of invocations by Dispatcher—BeginInvoke and Invoke. We have already seen the uses of BeginInvoke, which basically invokes delegate and returns to perform other operations while delegate is still running on the UI thread.
On the other side, the Invoke operation does not return until delegate completes its execution on the UI thread.
BeginInvoke is always preferable unless there is a specific reason to wait for the UI operation to complete.
Dispatcher maintains a queue of requests that need to be processed on the UI thread. This is basically handled by setting DispatcherPriority. The default priority is DispatcherPriority.Normal, but you can set a lower or a higher priority based on the importance of the operation.