繁体   English   中英

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

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

我试图理解我刚刚在这个链接中找到的这段代码:

我很好奇在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));
}

如果这两种方法的其中一个代码中有一个长时间运行的查询,浏览器的网络控制台会出现什么行为?

查询运行时异步方法是否会返回状态码 202? 或者它会出错并说像查询超时?

正如 Ian Kemp 所说“异步/等待......对 HTTP 协议没有影响”

客户视角

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

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

服务器视角

您的 ASP.NET WebAPI 在到达控制器操作结束之前不会向调用者返回任何内容。

await 关键字说:

  • 可能存在长时间运行的操作。
  • 正在执行的Thread无法继续执行下一条语句,因为它依赖于异步操作的结果。
  • 因为Thread无法对这个请求做任何事情,所以返回ThreadPool并为其分配一个新作业(例如另一个请求)直到异步操作运行是有意义的。
  • 当该异步操作完成时,将通知ThreadPool并将 Controller 的剩余 Action 调度到适当的Thread

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM