take the delegate instance passed, as well as the array of parameters needed to pass to delegate instance call, and queue this data in some queue read by the UI thread. This way, the call is done be a UI thread. This mechanism is only needed when you call invocation methods from some thread other then the UI thread. (In fact, it can also be used as a trick to modify order of event handling, but should be used with great care.)
As you say no word about threads, it may mean that you are using invocation in vain. Please check it up.
For explanation in some more detail, please see my past answers:Control.Invoke() vs. Control.BeginInvoke()
],Problem with Treeview Scanner And MD5
You can also get a good idea of how it is internally implemented, if you read my short article where I introduce similar mechanism for non-UI (custom, user-written) thread. Please see:Simple Blocking Queue for Thread Communication and Inter-thread Invocation