我点击Button1
开始一个程序循环。该循环在Button1
的Click-Event-Handler中执行。
我的要求:
循环应每次在代码中的某个点停止,并等待Button2被按下,然后继续执行。
我尝试过:
private ManualResetEvent mre = new ManualResetEvent(false);
以及我的Button1
事件处理程序中:
mre.WaitOne();
以及在我的Button2事件处理程序中:
mre.Set();
mre.Reset();
...但是当我到达WaitOne()
-事件处理程序中的Button1
时,我的所有应用程序都冻结了。您对我有什么提示吗,我做错了什么?
答案 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();
}
请注意,处理程序中可以有多个等待。第一个显然是没有必要的。它只会减慢循环速度,因此您可以看到数字的变化。另外请注意,您可以将延迟更改为荒谬的长时间,并且表单仍将保持响应状态!