为什么验证事件处理程序不能与async / await(C#)一起使用?

时间:2017-07-11 14:30:22

标签: c# async-await validating

A有一个简单的文本框,我等待验证处理程序内的延迟任务。始终调用Validated处理程序,与是否e.Cancel = true无关!请注意,如果我省略了await调用,则会按预期进行验证。为什么会这样?

private async void textBox1_Validating(object sender, CancelEventArgs e)
{
    await Task.Delay(2000);

    e.Cancel = true;
}

private void textBox1_Validated(object sender, EventArgs e)
{
    MessageBox.Show("THIS WILL ALWAYS BE CALLED!");
}

1 个答案:

答案 0 :(得分:4)

一旦事件完成调用所有事件处理程序,触发事件的代码将检查e.Cancel的值。由于您的代码最终从事件处理程序返回,然后在稍后的时间点更改e.Cancel 的值,因此触发事件处理程序的代码已经很久才完成检查{ {1}}并确定在您更改值时验证是否成功。