簡體   English   中英

從瀏覽器調用異步方法

[英]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測試過

HTTP://本地主機:端口/測試

,但是我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM