我通过单击Button1
启动程序循环。循环在Button1
的 Click-Event-Handler 中执行。
我的要求:
循环应每次在代码中的某个点停止,并等待按下 Button2 后再继续执行。
我试过了:
private ManualResetEvent mre = new ManualResetEvent(false);
在我的Button1
事件处理程序中:
mre.WaitOne();
在我的 Button2 事件处理程序中:
mre.Set();
mre.Reset();
。但是当我在Button1
-Event-Handler中达到WaitOne()
时,我的所有应用程序都冻结了。你对我有什么暗示吗,我做错了什么?
用异步标记 Button1 单击处理程序(在返回类型中的 void 之前),然后等待调用 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();
}
请注意,处理程序中可以有多个等待。 第一个显然没有必要;它只是减慢了循环速度,因此您可以看到数字的变化。 另请注意,您可以将延迟更改为非常长的金额,并且表单仍将保持响应!