异步和等待需要澄清

ckv*_*ckv 3 c# async-await

我阅读了许多关于异步和等待的文章(主要来自msdn - 实际上这很好).还有一个问题困扰着我,我无法找到答案.

如果任务上有await语句,则控制权将返回给其调用者,直到在调用者中再次等待它为止.在这种情况下,这个耗时的任务是在一个单独的线程中执行的吗?如果没有,那么它是如何与主线程并行执行的.

async Task<string> GetContentsAsync()
{
    int sample = 0;
    HttpClient client = new HttpClient();
    Task<string> contents = client.GetStringAsync("http://www.microsoft.com");
            
    string data = await contents;
    return data;
}
Run Code Online (Sandbox Code Playgroud)

我希望我的问题很明确.

Ste*_*ary 5

在这种情况下,这个耗时的任务是在一个单独的线程中执行的吗?

有两种任务.有些人Task有代码要执行,他们在某个线程上运行.其他Tasks 执行代码; 他们只代表一些未来的事件.

"事件任务"被大量使用async,尤其是在I/O场景中.在您的示例中,您正在执行HTTP GET.GetStringAsync将发送HTTP请求,然后返回在收到响应时完成的"事件任务".当HTTP请求在飞行中并由服务器处理时,客户端没有代码来执行该请求.因此,不需要任何线程,也没有使用任何线程.

另见这里的答案.