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 为服务器应用程序提供了可扩展性(更大的吞吐量)。
我正在尝试理解我刚刚在 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 为服务器应用程序提供了可扩展性(更大的吞吐量)。