为什么验证事件处理程序不能与 async/await (C#) 一起使用?
Why Validating event handler cannot be used with async/await (C#)?
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!");
}
触发事件的代码将在事件完成调用所有事件处理程序后立即检查 e.Cancel
的值。由于您的代码最终从事件处理程序返回,然后在更晚的时间点 更改 e.Cancel
的值,因此触发事件处理程序的代码已经很久了完成检查 e.Cancel
并在您更改值时确定验证是否成功。
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!");
}
触发事件的代码将在事件完成调用所有事件处理程序后立即检查 e.Cancel
的值。由于您的代码最终从事件处理程序返回,然后在更晚的时间点 更改 e.Cancel
的值,因此触发事件处理程序的代码已经很久了完成检查 e.Cancel
并在您更改值时确定验证是否成功。