异步/等待链如何工作

时间:2018-09-23 08:39:41

标签: c# async-await asp.net-core-webapi

这个问题可能看起来很重复,但是我已经读够了,但仍然找不到我的问题的答案。

让我们想象一下我有这样的伪代码。

[HttpGet("someendpoint")]
public Task<IActionResult> DoSomethingAsync()
{
   await DoSomethingPrivateAsync();
}

private Task DoSomethingPrivateAsync()
{
   await ADONETExecuteReaderAsync();
}

点击someendpoint会发生什么。我了解遇到await时,控制权将返回给调用者。但是谁在DoSomethingPrivateAsync内部运行代码?

此外,假设此Web API托管在Kestrel或任何Web服务器上,那么当按下await返回控件时会发生什么?

我上面的示例非常简单,但是我试图从更广阔的角度进行理解。例如,如果存在await的长链(之间有一些IO操作),执行如何发生?

1 个答案:

答案 0 :(得分:0)

基本上完全异步地执行I / O绑定操作时,将发生以下步骤:

  1. 请求线程调用异步I / O方法并等待它,这意味着请求处理程序线程可以在第一个请求对I / O操作时处理另一个请求

  2. 为I / O操作创建的任务

  3. 其中一个线程池线程处理任务

  4. 在I / O端,线程不会阻塞,现在该作业可以在I / O(如磁盘或网络)上工作。我们给操作系统一个文件描述符,然后说:“嘿,os用这个描述符完成这项工作,并在完成或发生任何数据更改时回叫我”

  5. 工作完成后,操作系统会回电给我们

因此,通过这种方式,请求作为异步处理,我们不会阻塞任何线程。

我建议您阅读Stephen Cleary的博客文章:

https://blog.stephencleary.com/2013/11/there-is-no-thread.html

https://blog.stephencleary.com/2012/02/async-and-await.html

https://blog.stephencleary.com/2016/12/eliding-async-await.html