The rule is, only the thread that creates a UI control should mess with it. That's part of the reason there's a "UI thread" at all -- and it keeps you from having to guess whether you need to Invoke
stuff or just do it. (If the event happens from a UI control, it's in the UI thread, so you can just do it. Otherwise, Invoke
.) So you want to create your controls in that thread, and let it be the one that handles all the UI as it was intended to.
Your UI thread has one purpose: to handle all the events from the UI in order to keep your app responsive, and to keep it from looking "frozen". Occasionally, it'll be busy (from handling other events), but it should always be either handling an event or waiting for another. Never call Thread.Sleep
on the UI thread unless you have a damn good reason and can specifically say why it's not a horrible idea. Just about anything you'd want to do with Thread.Sleep
could be handled with timers instead and be much less rickety.
Short version: yes, if the UI thread is doing something (even sleeping), calls to Control.Invoke will almost certainly wait til it's not. If the thread's sleeping, that could be a very long time.