我在理解如何使用异步和等待工作时遇到了一些困难。
我知道当异步方法遇到await表达式时,该方法会立即返回,并且在将来的某个时刻,await表达式会返回,并且该方法会继续执行。
那么,我不理解的是,当异步方法包含多个await表达式时会发生什么?当执行命中第二个等待表达式时,由于该方法在命中第一个等待表达式后已经返回,因此在第二个等待表达式周围执行会发生什么?
我目前正在阅读两本关于异步和等待的书,但我黑暗的头脑还没有被这两本书照亮!
发布于 2015-03-19 19:39:47
我知道当一个异步方法遇到一个await表达式时,该方法会立即返回,在将来的某个时刻,await表达式会返回,并且该方法会继续执行。
是的,如果等待的还没有完成的话。
当执行命中第二个等待表达式时,由于该方法在命中第一个等待表达式后已经返回,因此在第二个等待表达式周围执行会发生什么?
它将控制权返回给执行延续的任何对象,这将取决于上下文。在UI线程中的WinForms应用程序中,它只是一个事件循环。在线程池线程中,它就是线程池调度程序。
无论继续调用什么,都有可能根本不关心它--它只是“在上下文中执行的东西”。它很可能会继续执行下一步需要做的任何事情(或者等到有更多的工作)。
重要的一点是,到目前为止,第一个调用者拥有适当的Task或Task<T>,这样他们就可以知道整个异步方法何时完成。
发布于 2015-03-22 09:56:17
回想一下,对于编译器遇到的每一次等待,它都会将方法的其余部分重写为延续。因此,2次等待将导致2次(嵌套的)延续,大致等同于(尽管过于简化):
FirstAsyncThing().ContinueWith(x => {
SecondAsyncThing().ContinueWith(y => {
// etc.
});
});因此,就像第一个await立即将控制权返回给方法的调用方一样,第二个await将控制权返回给第一个control的调用方,这是原始方法的第一部分。
https://stackoverflow.com/questions/29143573
复制相似问题