На данный вопрос уже ответили:
Решил пощупать приложение с окнами, и тут возникла проблема. Есть код:
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-метода.
Третий способ - можно вынести цикл в отдельный поток.
Продвижение своими сайтами как стратегия роста и независимости