BeginInvoke invokes an Action , which you pass to it asynchronously in the thread that is associated with Dispatcher , while Invoke invokes this action synchronously.
In other words, Invoke immediately executes what ever the Action passed to it, and BeginInvoke puts the action that you pass it to the Dispatcher queue, which looks like a list of things Dispatcher will do, but without any guarantees when this will happen or how only the dispatcher will finish doing other things waiting in this queue.
Therefore, sometimes Dispatcher may be busy with something else and passes the action that you pass to BeginInvoke at the end of the queue until it can perform it, and then it will perform any action that you pass to Invoke , and this will cause differences in orders.
source share