The thread owning the hwnd belonging to the control instance (I your case
the main GUI thread) will execute the delegate, the calling worker thread
will "block" pending the return of the call to Invoke, which returns when
the delegate returns. Of course in the case of BeginInvoke the calling
thread does not block, BeginInvoke returns immediately and the worker
threads continues