кнопка ставит в очередь свои события щелчка вместо того, чтобы отключить это - PullRequest
0 голосов
/ 14 сентября 2018

Я изменяю свойство моей кнопки " Включено " на " false ", но моя кнопка по-прежнему ловит щелчок событие .Я поместил Thread.Sleep () метод, чтобы имитировать какой-то процесс.Пока моя кнопка неактивна, я нажимаю на нее, и после завершения текущего процесса она снова начинает работать (потому что я нажимала на нее, пока она была неактивной)

Вот мой код:

    int i = 0;

    public Form1()
    {
        InitializeComponent();
        label1.Text = "0";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //first click
        button1.Enabled = false;
        i++;
        Thread.Sleep(3000);           //if i click twice more while button is greyed-out the app will be non-responsive for 9 second and then prints "3" to my label
        label1.Text = i.ToString();
        button1.Enabled = true;
    }

Как я могу полностью отключить свою кнопку (не позволяя событиям подняться, но видимым)?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Вы блокируете поток пользовательского интерфейса, который предотвращает что-либо происходящее в пользовательском интерфейсе.Вам следует рассмотреть возможность использования TPL для такой работы.

private async void button1_Click(object sender, EventArgs e)
{
    //first click
    button1.Enabled = false;

    i++;

    await Task.Delay(TimeSpan.FromSeconds(3));

    label1.Text = i.ToString();
    button1.Enabled = true;
}
0 голосов
/ 14 сентября 2018

Вызов Thread.Sleep (3000) блокирует функцию, поэтому кнопка не отключается.Быстрое и грязное решение этой проблемы - вызвать Application.DoEvents(); сразу после button1.Enabled = false;.Это заставляет приложение обрабатывать любые ожидающие события и должно гарантировать, что кнопка отключена.

Если вы планируете заменить Thread.Sleep (3000) на длительный процесс, вам следует использовать BackgroundWorker.Вы найдете его в разделе «Компоненты» в конструкторе инструментов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...