ASP.NET Web API - 浏览器网络控制台中异步和同步方法的区别

ASP.NET Web API - difference between Async and Synchronous method in browser's Network Console

我正在尝试理解我刚刚在 link:

中找到的这段代码

我很好奇在 Web 中使用异步和同步方法有什么区别API:

异步:

[HttpGet("{id}", Name = "GetBook")]
public async Task<IActionResult> GetBookWithBookCovers(Guid id)
{
    var bookEntity = await _booksRepository.GetBookAsync(id);

    if (bookEntity == null)
    {
        return NotFound();
    }

    // get bookcovers
    var bookCovers = await _booksRepository.GetBookCoversAsync(id);

    // map book & covers into one BookWithCovers
    var mappedBook = _mapper.Map<BookWithCovers>(bookEntity);
    return Ok(_mapper.Map(bookCovers, mappedBook));
}

同步:

[HttpGet("{id}", Name = "GetBook")]
public IActionResult GetBookWithBookCovers(Guid id)
{
    var bookEntity = _booksRepository.GetBook(id);

    if (bookEntity == null)
    {
        return NotFound();
    }

    // get bookcovers
    var bookCovers = _booksRepository.GetBookCovers(id);

    // map book & covers into one BookWithCovers
    var mappedBook = _mapper.Map<BookWithCovers>(bookEntity);
    return Ok(_mapper.Map(bookCovers, mappedBook));
}

如果这两种方法的代码之一中有一个很长的运行查询,那么在浏览器的网络控制台中会有什么表现?

当查询为 运行 时,异步方法是否会进入 return 状态码 202?或者它会出错并说查询超时?

正如 Ian Kemp 所说 "async/await ... 对 HTTP 协议没有影响"

客户视角

没有区别。如果在请求处理期间没有发生异常,那么在这两种情况下,相同的 OK 状态代码将 return。

同步或异步处理应被视为实现细节。如果您有 OpenAPI 文档 (a.k.a Swagger),那么这两种方法看起来完全一样。

服务器视角

您的 ASP.NET WebAPI 不会 return 调用者任何东西,直到它到达控制器操作的结尾。

等待关键字表示:

  • 可能有一个 long-running 操作。
  • 正在执行的Thread无法继续执行下一条语句,因为它依赖于异步操作的结果。
  • 因为 Thread 不能对这个请求做任何事情,return 到 ThreadPool 并分配一个新的工作给它是有意义的(例如另一个请求) 直到异步操作为 运行.
  • 当异步操作完成时,ThreadPool 将收到通知,它将控制器的剩余操作安排到适当的 Thread

async/await 设计(主要)是为了支持 non-blocking 异步 I/O 操作。这意味着在网络驱动程序处理 I/O 请求之前,计算执行程序(线程)可以处理其他事情。

简而言之,async/await 为服务器应用程序提供了可扩展性(更大的吞吐量)。