【问题标题】:Why must "await" be inside an "async" method? [duplicate]为什么“等待”必须在“异步”方法中? [复制]
【发布时间】:2012-12-03 00:46:45
【问题描述】:

可能重复:
Why does the async keyword exist

我有两种方法。一种是普通方法(MyMethod),一种是异步方法(MyMethodAsync)。我收到编译错误。

static string MyMethod()
{
    var result = await MyMethodAsync(); // compile error here
    return result;
}

async static Task<string> MyMethodAsync()
{
    /** perform my logic here... **/
    Thread.Sleep(1000);

    return "yes";
}

错误信息是

“await”运算符只能在异步方法中使用。考虑使用 'async' 修饰符标记此方法并将其返回类型更改为 'Task'。

我很困惑。当我使用await 关键字时,调用线程将被挂起并等待任务完成。所以一旦await 被使用,该方法就不再是异步方法了。对吧?

备注:我知道我应该把逻辑放在MyMethodMyMethodAsync 调用MyMethod 来实现我想要的。

【问题讨论】:

    标签: c# async-await


    【解决方案1】:

    async 关键字的全部意义在于启用await 关键字。

    我收集了一些“为什么关键字会这样工作?”问题on my blog。 “为什么不能通过await 的存在来推断async?”的问题?是answered conclusively by Eric Lippert on his blog。简而言之,有两个原因:向后兼容性和代码可读性。

    【讨论】:

      【解决方案2】:

      如需深入了解 async 和 await 如何在内部工作,请查看 Jon Skeet 的 EduAsync 博客系列:msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx

      这篇 MSDN 文章也有解释:http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

      基本上:被 async 关键字修改的方法至少包含一个 await 表达式或语句。该方法同步运行,直到它到达第一个等待表达式,此时它被挂起,直到等待的任务完成。同时,控制权返回给方法的调用者。如果方法不包含 await 表达式或语句,则同步执行。

      最后,这篇 MSDN 文章:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx 逐步介绍了一个示例,大约在页面下方的 1/3:

      【讨论】:

        猜你喜欢
        • 2020-03-10
        • 1970-01-01
        • 2023-04-06
        • 2014-01-02
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-09
        相关资源
        最近更新 更多