簡體   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