From my understanding, the form and all of its graphical controls run on the main thread. The form is displayed by the main thread and the inputs from the keyboard and mouse are received via the message pump and are executed on that same main thread. I also believe that the code you write also runs on that same thread, unless you create other threads for it to run on. For example, the code you write in the Form1() constructor will run on that same thread. If you make a never ending loop on that thread then the GUI will never display.
How does the code you write for that thread plus the input events received from the message pump all run in the same thread? Also, when you use Invoke on a delegate for it to run on the main thread, how does it get run on the main thread when the main thread already has a list of instructions that it is running. I don't understand how a thread can have a list of instructions that it is executing and then receive some instructions from somewhere else to run also. Does it have code to go periodically check (between running other instructions) some queue? I can understand if 2 execution paths ran on different threads, but don't understand it being on the same thread.