Application.Run internally maintains the message/event loop
Control.BeginInvoke is similar to PostMessage
Control.Invoke, though internally implemented using PostMessage, will wait for the execution to complete like SendMessage
WinFormSynchronizationContext or WPF Dispatcher should be used instead of Control.BeginInvoke/Invoke, because the Control might be already disposed when you call its BeginInvoke in another thread, whereas the SynchronizationContext maintains its own control that has a longer life time scope.