【问题标题】:ASP.NET Web API - difference between Async and Synchronous method in browser's Network ConsoleASP.NET Web API - 浏览器网络控制台中异步和同步方法的区别
【发布时间】:2020-11-26 12:07:34
【问题描述】:

我正在尝试理解我刚刚在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));
}

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

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

【问题讨论】:

  • 没有区别。 async/await 是对 HTTP 协议没有影响的 C# 实现细节。
  • 让你的控制台应用程序多线程,也就是同时调用相同的 url 50 次,异步版本将能够比同步版本更好地处理这个问题。所以你应该看到异步处理更多的请求。

标签: c# asp.net-web-api task-parallel-library


【解决方案1】:

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

客户视角

没有区别。如果在请求处理过程中没有发生异常,则两种情况下都会返回相同的 OK 状态码。

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

服务器视角

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

await 关键字说:

  • 可能存在长时间运行的操作。
  • 正在执行的Thread 无法继续执行下一条语句,因为它依赖于异步操作的结果。
  • 因为Thread 无法处理此请求,所以返回ThreadPool 并为其分配一个新作业(例如另一个请求)直到异步操作运行是有意义的。李>
  • 当异步操作完成后,ThreadPool 将收到通知,并将控制器的剩余操作安排到适当的Thread

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

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

【讨论】:

  • 感谢您清理它。现在我想到的下一件事是,是否有办法从服务器端(Azure 应用程序服务中的 Web api)提取长时间运行的查询,因为它的超时是不可替代的,我需要根据这个答案制作异步模式链接:social.msdn.microsoft.com/Forums/en-US/…
  • @ajgo 我认为值得提出一个新问题来单独讨论这个话题。你同意吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2018-06-09
  • 2016-08-02
  • 1970-01-01
  • 2011-01-09
  • 2013-04-22
相关资源
最近更新 更多