На данный вопрос уже ответили:
Решил пощупать приложение с окнами, и тут возникла проблема. Есть код:
Random rnd = new Random();
for (int i = 0; i < 9; i++)
{
int value = rnd.Next(1, 6);
switch (value)
{
case 1:
label3.Text = "";
break;
case 2:
label3.Text = "";
break;
case 3:
label3.Text = "";
break;
case 4:
label3.Text = "";
break;
case 5:
label3.Text = "";
break;
}
Thread.Sleep(2000);
label4.Text = Convert.ToString(i);
}
Однако Thread.Sleep(2000);
не работает. Когда я запускаю программу, она как будто игнорирует слип, и в label.4 сразу выводится 8.
Почему так и как выйти из данной ситуации?
Ничего странного. Когда вы меняете текст надписи - ее регион в окне инвалидируется и в очередь сообщений посылается сообщение WM_PAINT. Но это сообщение может быть обработано только после того, как ваш цикл завершит работу.
Есть три способа исправить такую ситуацию. Первый - старый - вызов Application.DoEvents()
внутри цикла, чтобы "разгрести" накопившиеся сообщения:
for (int i = 0; i < 9; i++)
{
Thread.Sleep(2000);
label4.Text = Convert.ToString(i);
Application.DoEvents();
}
Второй способ - объявить метод асинхронным (async) и использовать await Task.Delay
для ожидания:
async void button1_Click (object sender, EventArgs e) {
for (int i = 0; i < 9; i++)
{
await Task.Delay(2000);
label4.Text = Convert.ToString(i);
}
}
Не забудьте только установить обработчик события Application.ThreadException
при использовании async void
-метода.
Третий способ - можно вынести цикл в отдельный поток.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При попытки вывести изображение из бд в представлении, компилятор не попадает в метод GetImage(), то бишь он не заходит в строку 33Если поставить...
Какими средствами WinAPI можно заблокировать перемещение окна консоли?