从异步点返回后线程正在做什么?

zin*_*ing 4 c#

我是.NET框架中提供的异步功能的新手

所以在我的理解中,async关键字提供的好处是,当线程调用异步方法时,它可以在await点返回并正确地恢复运行.

我的问题是从它返回之后,线程在做什么?它可以用于在线程池中运行其他任务项,如果是这样,必须还有上下文切换?如果没有,为什么不旋转呢?

=====所以会有其他线程来接管异步函数的未完成部分,这个上下文切换是如何发生的,比如这些状态存储在哪里?以及另一个线程如何处理这些状态

SLa*_*aks 5

当你的代码遇到一个await表达式时(假设等待没有同步完成),控制权返回到调用方法,就像你写的一样return;.
(它返回一个Task<T>调用者可以用来等待异步部分完成的)

然后调用方法将继续执行,直到返回(它通常会立即返回,因为它也是await返回的任务),依此类推,直到它到达调用堆栈的(面向用户的部分)的顶部.

一旦它到达调用堆栈的顶部,该线程将做它自然做的任何事情.

如果它是一个UI线程,它将返回到消息循环,保持UI响应.

如果它是一个ThreadPool线程(或ASP.Net工作线程),它将返回池并等待(同步)以进行更多工作.

如果它是一个"原始"线程(控制台应用程序中的主线程,或者new Thread()它,它将终止.