I tried to explain it in my past answers:
Control.Invoke() vs. Control.BeginInvoke()[
^],
Problem with Treeview Scanner And MD5[
^].
There difference between
BeginInvoke
and
Invoke
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!
—SA