【问题标题】:The async method is not awaited不等待异步方法
【发布时间】:2018-08-17 04:29:28
【问题描述】:

我有这三种方法:

Public myConstructor()
        {
            myMethodAsync02();

            string myDummy = "";
        }


        private async void myMethodAsync02()
        {
            await myMethodAsync();
        }


        private async Task myMethodAsync()
        {
            await Task.Delay(5000);


            string myDummy = "";
        }

当我单击按钮时,在 myMethod() 完成之前到达带有 myDummy 字符串的行。

我想知道如何等到异步方法在 5 秒后完成。

我知道 myMethodAsync02 应该返回一个任务,但这是我真实案例的简化示例,因为在我的真实案例中 yMethodAsync02 方法是一个事件处理方法,所以它必须返回一个 void 类型。

谢谢。

【问题讨论】:

  • 你有异步无效。这是一个非常糟糕的主意。不要这样做,除非它是一个事件处理程序。见Async Await Best Practices。您需要等待您致电myMethodAsync02。这意味着它需要返回一个任务。
  • @mason 根据史蒂夫的回答,对于事件处理程序是允许的;除此之外:任务和等待
  • MyMethod02 是一个事件处理程序,因此唯一的选项是返回 void。
  • @MarcGravell 是的,我确实包含了免责声明“除非它是事件处理程序”。
  • @mason 显然我今天阅读失败:(

标签: c# async-await


【解决方案1】:
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await myMethodAsync02();

    string myDummy = "";
}

private Task myMethodAsync02()
{
     return myMethodAsync();
}

只需让您的事件异步并等待它。

【讨论】:

  • 嗯,这种情况下点击事件方法可以是异步的,但我的实际情况是构造函数,所以不能异步。
  • @ÁlvaroGarcía 构造函数不应调用任何异步方法。您应该创建另一个异步初始化方法并使用工厂样式方法来生成您的对象
  • @ÁlvaroGarcía 您最初的问题表明它是从事件处理程序而不是构造函数调用的。在有人回答之后再改变这样的问题不太公平。
【解决方案2】:

因为您的myMethodAsync02();async void 并且没有等待(在这种情况下也不可能)因此它立即执行并且点击事件主体的执行直接继续到string myDummy = "";

在你的情况下,你不需要myMethodAsync02();,只需要await myMethodAsync()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多