Не работает задержка в C#

Рейтинг: 1Ответов: 1Опубликовано: 24.08.2023
    private void buttonconfirm_Click(object sender, EventArgs e)
    {
        if (login.Text == "")
        {
            text_error.Visible = true;
            Thread.Sleep(1000);
            text_error.Visible = false;
        }
        else if (password.Text == "") {
            text_error.Visible = true;
            Thread.Sleep(1000);
            text_error.Visible = false;
        }

login и password это текстовые блоки и если человек оставляет эти поля пустыми или хотя бы одно у него должно показывать на экране текст(label) и через секунду убирать его, а у меня вообще ничего не показывает и все, хотя задержка есть, по кнопке видно.

Ответы

▲ 2Принят
private async void buttonconfirm_Click(object sender, EventArgs e)
{
    if (login.Text == "")
    {
        text_error.Visible = true;
        await Task.Delay(1000);
        text_error.Visible = false;
    }
    else if (password.Text == "") {
        text_error.Visible = true;
        await Task.Delay(1000);
        text_error.Visible = false;
    }

// ...

Лучше не использовать Thread.Sleep в UI приложениях (WinForms, WPF, Avalonia, ...), т.к. этот метод полность блокирует поток и приложение вообще не обновляется, т.е. в вашем случае оно просто "виснет" на одну секунду.

Вместо этого можно использовать асинхронный обработчик и Task.Delay. Оно преостанавливает выполнение кода на одну секунду, но не блокирует поток, т.е. ваше приложение имеет возможноть перерисовывать окно и весь контент.