C#:如何停止我的程序,直到单击一个按钮

时间:2019-04-14 15:03:37

标签: c# event-handling

我点击Button1开始一个程序循环。该循环在Button1的Click-Event-Handler中执行。

我的要求:

循环应每次在代码中的某个点停止,并等待Button2被按下,然后继续执行。

我尝试过:

private ManualResetEvent mre = new ManualResetEvent(false);

以及我的Button1事件处理程序中:

mre.WaitOne();

以及在我的Button2事件处理程序中:

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

...但是当我到达WaitOne()-事件处理程序中的Button1时,我的所有应用程序都冻结了。您对我有什么提示吗,我做错了什么?

1 个答案:

答案 0 :(得分:1)

使用async(在返回类型中的空白之前)标记您的Button1单击处理程序,然后使用await和一个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();
}

请注意,处理程序中可以有多个等待。第一个显然是没有必要的。它只会减慢循环速度,因此您可以看到数字的变化。另外请注意,您可以将延迟更改为荒谬的长时间,并且表单仍将保持响应状态!