[英]Calling an async method from the browser
根據我的理解, 當我們使用await並且等待的任務尚未完成時,執行將返回給調用者 。 它在服務器端工作正常(從服務器端方法本身調用異步方法)。 但是當我從UI調用異步方法時會發生什么。
public class TestController : ApiController
{
IList<string> lstString = new List<string>();
public async Task<IList<string>> GetMyCollectionAsync()
{
lstString.Add("First");
string secString = await GetSecondString(); // I am expecting a response back to UI from here.
lstString.Add(secString);
lstString.Add("Third");
return lstString;
}
private async Task<string> GetSecondString()
{
await Task.Delay(5000);
return "Second after await";
}
}
我用瀏覽器中的上述API測試過
,但是我的UI中只有5秒后才收到回復。 我錯誤地思考了嗎?
我錯誤地思考了嗎?
是。 async-await
不會改變HTTP協議的性質,HTTP協議的類型是請求 - 響應。 在ASP.NET控制器中使用async-await
,使用async方法不會產生對調用者的響應,它只會將請求線程返回給線程池。
但如果這是真的,那么在控制器端使用具有單個等待的異步方法是沒有用的。 對? 因為它花了相同的同步調用時間
當您需要可伸縮性時,異步會閃耀。 它不是“盡可能快地產生這種響應”,它是關於能夠處理大量請求而不會耗盡線程池。 一旦線程開始執行IO工作,而不是被阻止,它將被返回。 因此,能夠提供更多的請求。
異步本身並沒有使任何“變得更快”,這是我認為人們在思考很多的概念。 如果您不打算通過許多並發請求訪問您的Web服務,那么您很可能不會看到使用它的任何好處。 正如@Scott指出的那樣,異步方法在幕后生成狀態機時會有輕微的開銷 。
async / await允許線程在空閑5秒時為其他請求提供服務,但最終GetMyCollectionAsync中的所有內容都必須在響應發送到客戶端之前完成。
所以我希望你的代碼需要5秒鍾,並在響應中返回所有3個字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.