Не спите основной поток вашего приложения. Вместо этого делайте все, что вам нужно, что требует ожидания в фоновом потоке вашего приложения.
Если вы поместите вызов Thread.Sleep () в основной поток вашего приложения, приложение, как вы видите, перестанет отвечать на цикл сообщений интерфейса пользователя за кулисами. Это связано с тем, что вы блокируете выполнение при обработке одного сообщения (событие пользовательского интерфейса, вызвавшее ожидание), поэтому другие сообщения для приложения не могут быть обработаны.
Вместо этого структурируйте этот код для асинхронного запуска. Я предполагаю, что есть какой-то метод, который содержит большую часть тяжелой работы, включая сон. Пока это не обработчик событий (его рефакторинг, если он есть), вы можете настроить второй поток для запуска этого метода и добавить метод «обратного вызова», который будет вызывать метод после его завершения, который обновит пользовательский интерфейс с помощью Результаты. Это немного больше работы, но она поддерживает отзывчивость приложения, и, как правило, это хорошая практика, особенно на многоядерных устройствах (в настоящее время даже телефоны получают двухъядерные процессоры). Есть много способов настроить многопоточные операции. Delegate.BeginInvoke мой любимый:
public delegate void BackgroundMethod()
public void HandleUITrigger(object sender, EventArgs e)
{
//we'll assume the user does something to trigger this wait.
//set up a BackgroundMethod delegate to do our time-intensive task
BackgroundMethod method = DoHeavyLifting;
//The Delegate.BeginInvoke method schedules the delegate to run on
//a thread from the CLR's ThreadPool, and handles the callback.
method.BeginInvoke(HeavyLiftingFinished, null);
//The previous method doesn't block the thread; the main thread will move on
//to the next message from the OS, keeping the app responsive.
}
public void DoHeavyLifting()
{
//Do something incredibly time-intensive
Thread.Sleep(5000);
//Notice we don't have to know that we're being run in another thread,
//EXCEPT this method cannot update the UI directly; to update the UI
//we must call Control.Invoke() or call a method that Invokes itself
ThreadSafeUIUpdate();
}
public void ThreadSafeUIUpdate()
{
//A simple, thread-safe way to make sure that "cross-threading" the UI
//does not occur. The method re-invokes itself on the main thread if necessary
if(InvokeRequired)
{
this.Invoke((MethodInvoker)ThreadSafeUIUpdate);
return;
}
//Do all your UI updating here.
}
public void HeavyLiftingFinished()
{
//This method is called on the main thread when the thread that ran
//DoHeavyLifting is finished. You can call EndInvoke here to get
//any return values, and/or clean up afterward.
}