C #: как остановить мою программу, пока кнопка не нажата - PullRequest
0 голосов
/ 14 апреля 2019

Я запускаю цикл программы нажатием Button1.Цикл выполняется в обработчике Click-Event Button1.

Мое требование:

Цикл должен останавливаться каждый раз в определенной точке кода и ждать нажатия Button2перед продолжением выполнения.

Я пытался:

private ManualResetEvent mre = new ManualResetEvent(false);

и в моем Button1 обработчике событий:

mre.WaitOne();

и в моем обработчике событий Button2:

mre.Set();
mre.Reset();

... но когда я достигаю WaitOne() в моем Button1 -Event-Handler, все мое приложение зависает.У вас есть намеки на то, что я делаю неправильно?

1 Ответ

1 голос
/ 14 апреля 2019

Пометьте свой обработчик нажатий Button1 с помощью async (перед пустым значением в типе возврата), затем await a Task , который вызывает WaitOne ():

private ManualResetEvent mre = new ManualResetEvent(false);

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

    for(int i = 1; i <=100; i++)
    {
        label1.Text = i.ToString();
        await Task.Delay(100);

        if (i % 10 == 0)
        {
            label2.Text = "Press Button2 to Continue";
            await Task.Run(() => { 
                mre.WaitOne();
                mre.Reset();
            });
            label2.Text = "";
        }
    }

    button1.Enabled = true;
}

private void button2_Click(object sender, EventArgs e)
{
    mre.Set();
}

Обратите внимание, что вы можете иметь несколько ожидающих внутри обработчика. Первый явно не нужен; это просто замедляет цикл, так что вы можете видеть изменение числа. Также обратите внимание, что вы можете изменить задержку до смехотворно большой суммы, и форма все равно останется отзывчивой!

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