![](/img/trans.png)
[英]Async and await - difference between console, Windows Forms and ASP.NET
[英]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.