I tried to explain it in my past answers:
Control.Invoke() vs. Control.BeginInvoke()
Problem with Treeview Scanner And MD5
There difference between
is this: first returns immediately, before delegate instance goes in the queue of the UI thread, got invoked and returns the result. So, the result is delivered in a deferred manner.
Also, you get a good chance to look under the hood if you read my small article where I implement invocation mechanism for a custom (other than UI) threads. It is complete with source code, explanation and usage samples:
Simple Blocking Queue for Thread Communication and Inter-thread Invocation
Happy New Year!