Starts a new OS thread to execute the delegate. When the delegate returns, the thread is destroyed. This is quite a heavy-weight operation (starting and destroying a thread) so you typically only do it if the method is going to be long-running.
Delegate.BeginInvoke will call the delegate on a thread pool thread. Once the method returns, the thread is returned to the pool to be reused by another task. The advantage of this is that queuing a method to the thread pool is relatively light-weight because you don't have to spin up a whole new thread every time.
Control.BeginInvoke executes the specified delegate asynchronously on the thread that the control's underlying handle was created on. It basically takes a delegate and runs it on the thread that created the control on which you called BeginInvoke. In other words Control.BeginInvoke invokes the method on the thread for the control. UI components are inherently single-threaded and every interaction with a UI control must be done on the thread that created it. Control.BeginInvoke is a handy way to do that.