首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async和await:多个await表达式

Async和await:多个await表达式
EN

Stack Overflow用户
提问于 2015-03-19 19:36:47
回答 2查看 441关注 0票数 2

我在理解如何使用异步和等待工作时遇到了一些困难。

我知道当异步方法遇到await表达式时,该方法会立即返回,并且在将来的某个时刻,await表达式会返回,并且该方法会继续执行。

那么,我不理解的是,当异步方法包含多个await表达式时会发生什么?当执行命中第二个等待表达式时,由于该方法在命中第一个等待表达式后已经返回,因此在第二个等待表达式周围执行会发生什么?

我目前正在阅读两本关于异步和等待的书,但我黑暗的头脑还没有被这两本书照亮!

EN

回答 2

Stack Overflow用户

发布于 2015-03-19 19:39:47

我知道当一个异步方法遇到一个await表达式时,该方法会立即返回,在将来的某个时刻,await表达式会返回,并且该方法会继续执行。

是的,如果等待的还没有完成的话。

当执行命中第二个等待表达式时,由于该方法在命中第一个等待表达式后已经返回,因此在第二个等待表达式周围执行会发生什么?

它将控制权返回给执行延续的任何对象,这将取决于上下文。在UI线程中的WinForms应用程序中,它只是一个事件循环。在线程池线程中,它就是线程池调度程序。

无论继续调用什么,都有可能根本不关心它--它只是“在上下文中执行的东西”。它很可能会继续执行下一步需要做的任何事情(或者等到有更多的工作)。

重要的一点是,到目前为止,第一个调用者拥有适当的TaskTask<T>,这样他们就可以知道整个异步方法何时完成。

票数 5
EN

Stack Overflow用户

发布于 2015-03-22 09:56:17

回想一下,对于编译器遇到的每一次等待,它都会将方法的其余部分重写为延续。因此,2次等待将导致2次(嵌套的)延续,大致等同于(尽管过于简化):

代码语言:javascript
复制
FirstAsyncThing().ContinueWith(x => {
    SecondAsyncThing().ContinueWith(y => {
        // etc.
    });
});

因此,就像第一个await立即将控制权返回给方法的调用方一样,第二个await将控制权返回给第一个control的调用方,这是原始方法的第一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29143573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档