Well, when I do it it's always initiated by user action, so since it disables the controls (visually too, grayed out) it seems like it should. It doesn't just randomly "hang". Before I had it disable and gray out it did, which is why I started disabling it.
Anything I know will take a long time, I set it up on a BackgroundWorker (or thread it properly, depending on the scale of the project) if I think it might make Windows think it's hung. For example, I wrote a program a few weeks ago to process a ridiculous number of server logs into a database then build a cache to make analyzing the data quicker.
The disabling everything is only for the users' benefit.
Thanks for getting me to spit out the right answer, Force Flow. =p I always forget that Windows gets a bit antsy with those things until it happens.
The best way I can think of to implement a delay without Windows freezing would be to create a background worker with a function that just has a while loop that loops until enough time has passed (so get the start time then loop until (start + delay >= now), then return.
If you wanted to it disable everything, just wrap the delay in with the Enabled = False/True statements.
You could also make it a bit more flexible by giving it a function to call when it was done delaying (to enable everything or something).