Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么验证事件处理程序不能与异步/等待(C#)一起使用?_C#_Async Await_Validating - Fatal编程技术网

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

为什么验证事件处理程序不能与异步/等待(C#)一起使用?,c#,async-await,validating,C#,Async Await,Validating,A有一个简单的文本框,我在验证处理程序中等待延迟任务。始终调用已验证的处理程序,与我是否有e.Cancel=true无关!请注意,如果省略wait调用,验证将按预期进行。为什么会发生这种情况 private async void textBox1_Validating(object sender, CancelEventArgs e) { await Task.Delay(2000); e.Cancel = true; } private void textBox1_Vali

A有一个简单的文本框,我在验证处理程序中等待延迟任务。始终调用已验证的处理程序,与我是否有
e.Cancel=true
无关!请注意,如果省略wait调用,验证将按预期进行。为什么会发生这种情况

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
,并在您更改值时确定验证是否成功。

触发事件的代码将在事件完成调用所有事件处理程序。由于您的代码最终从事件处理程序返回,然后在更晚的时间点更改
e.Cancel
的值,触发事件处理程序的代码早就完成了检查
e.Cancel
,并在您更改值时确定验证是否成功。

如果在
等待之前将
e.Cancel
设置为true,则可能需要添加此项,然后在调用方检查值时将设置它,因为代码将同步运行,直到任何
wait
s.@clcto,为什么不将此结果作为答案发布?在
wait
之前设置
e.Cancel
确实会解决问题,因为不会调用
Validated
。@Sinatr它不会解决问题,因为异步操作(在真实代码中)可能会确定项目是否有效。如果在确定控件是否有效时没有使用异步操作,那么可以完全忽略它,正如OP提到的那样,这解决了问题。事实上,我想等待一个任务,其结果将定义e.Cancel是否应设置为true或false。这就是为什么我没有在等待呼叫之前设置e.Cancel。@Servy是的,你是对的。我考虑了更多其他事件,比如关闭,在这里可以取消、等待,然后在必要时调用close:您可能想添加这样的内容:如果您在等待任何东西之前将
e.cancel
设置为true,那么它将在调用方检查值时设置,因为代码将同步运行,直到任何
wait
s.@clcto,你为什么不把这个发现作为一个答案呢?在
wait
之前设置
e.Cancel
确实会解决问题,因为不会调用
Validated
。@Sinatr它不会解决问题,因为异步操作(在真实代码中)可能会确定项目是否有效。如果在确定控件是否有效时没有使用异步操作,那么可以完全忽略它,正如OP提到的那样,这解决了问题。事实上,我想等待一个任务,其结果将定义e.Cancel是否应设置为true或false。这就是为什么我没有在等待呼叫之前设置e.Cancel。@Servy是的,你是对的。我在考虑更多其他事件,如关闭,您可以取消、等待,然后在必要时调用关闭:您真的需要使用
Validated
事件吗?只需运行
验证中的所有内容
@Sinatr这就是我最终所做的。。。我只是想知道一个解释。你真的需要使用
Validated
事件吗?只需运行
验证中的所有内容
@Sinatr这就是我最终所做的。。。我只是想知道一个解释。