簡體   English   中英

縮短 ASP.NET WebService 調用的響應時間

[英]Improve Response Time for ASP.NET WebService Calls

我們有一個 WebAPI 服務 (.NET Framework 4.7.2),它向消費者返回記錄列表。

一開始,為了構建列表,控制器使用不支持異步調用的服務客戶端對外部系統進行了 2 個同步 Web 服務調用。

現在,由於新的要求,控制器必須對外部系統進行兩次以上的 WebService 調用。

是否可以使用 Task.Run 將同步請求卸載到並行任務以提高響應時間? (讓請求並行執行,而不是一個接一個)執行此操作的代碼如下所示:

    public async Task<IEnumerable<T>> FetchAllRecordsAsync(List<Query> queries)
    {
        List<T> fetchedRecords = new List<T>();
        List<Task<IEnumerable<T>>> fetchRecordsTasksCollection = new List<Task<IEnumerable<T>>>();

        foreach (var query in queries)
        {
            //Calling the Synchronous Web Service Call
            fetchRecordsTasksCollection.Add(Task.Run(() => FetchAllRecords(query)));
        }

        var results = Task.WhenAll(fetchRecordsTasksCollection.ToArray());
        await results;

        if (results.Status != TaskStatus.RanToCompletion)
            throw new Exception("Failed to fetch records");

        foreach (var result in fetchRecordsTasksCollection)
        {
            fetchedRecords.AddRange(await result);
        }

        return fetchedRecords;
    }

或者有沒有更好的方法來做到這一點?

參考資料: https : //devblogs.microsoft.com/pfxteam/should-i-expose-asynchronous-wrappers-for-synchronous-methods/

感謝您的幫助!

這是一個很好的問題。

理想情況下,我會想象FetchAllRecords會做 IO 綁定的工作,比如與數據庫或其他一些服務器交談,所以它會是異步的並返回一個Task ,我會開始調查為什么不是這種情況,是它阻塞異步工作?

考慮到這一點,我將假設FetchAllRecords執行一些需要超過幾毫秒的工作。 現在您需要進行權衡,您是否希望傳入的請求具有盡可能低的延遲? 在這種情況下, Task.Run會為您提供並行工作,這在延遲方面更為優化。

但是,您正在使用線程池線程來實現這一點,現在任何 1 個請求可能一次最多使用 2 個線程。 出於可擴展性的原因,這通常是您想要避免的,因為它會限制您在該特定服務器上的服務的整體效率。 這與 async 試圖實現的目標直接相反。 如果這是一個不處理很多請求的服務器,也許這無關緊要,這是您的電話。

所以這取決於🙂

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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