【问题标题】:Why Validating event handler cannot be used with async/await (C#)?为什么验证事件处理程序不能与 async/await (C#) 一起使用?
【发布时间】:2017-07-11 22:39:42
【问题描述】:

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!");
}

【问题讨论】:

  • 你真的需要使用Validated事件吗?只需运行 Validating 中的所有内容。
  • @Sinatr 这就是我最终所做的……我只是想知道对此的解释。

标签: c# async-await validating


【解决方案1】:

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

【讨论】:

  • 您可能需要补充一点,如果您在 awaiting 之前将 e.Cancel 设置为 true,那么它将在调用者检查该值时设置,因为代码将同步运行,直到任何 @987654327 @s.
  • @clcto,您为什么不将此发现作为答案发布?在await 之前设置e.Cancel 确实可以解决问题,因为不会调用Validated
  • @Sinatr 这不会解决问题,因为异步操作(在实际代码中)可能正在确定项目是否有效。如果异步操作 没有 用于确定控件是否有效,那么它可以完全省略,正如 OP 自己提到的那样,解决了问题。
  • 事实上,我想等待一个任务,其结果将定义 e.Cancel 是否应该设置为 true 或 false。这就是为什么我没有在 await 调用之前设置 e.Cancel 的原因。
  • @Servy 是的,你是对的。我在考虑更多其他事件,例如关闭,您可以在其中取消、等待,然后在必要时调用 close:stackoverflow.com/questions/16656523/…
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2018-04-11
  • 2021-06-05
  • 1970-01-01
  • 2015-02-01
  • 2019-09-29
相关资源
最近更新 更多