簡體   English   中英

同時運行多個任務C#

[英]Concurrently running multiple tasks C#

我在IIS中擁有REST Web API服務,該服務接受請求對象的集合。 用戶可以輸入100多個請求對象。

我想同時運行這100個請求,然后匯總結果並發回。 這涉及到I / O操作(為每個請求調用后端服務)和CPU綁定操作(以計算少量響應元素)

代碼段-

using System.Threading.Tasks;
....

var taskArray = new Task<FlightInformation>[multiFlightStatusRequest.FlightRequests.Count];

for (int i = 0; i < multiFlightStatusRequest.FlightRequests.Count; i++)
{
    var z = i;
    taskArray[z] = Tasks.Task.Run(() =>
        PerformLogic(multiFlightStatusRequest.FlightRequests[z],lite, fetchRouteByAnyLeg)
        );
}
Task.WaitAll(taskArray);
for (int i = 0; i < taskArray.Length; i++)
{
    flightInformations.Add(taskArray[i].Result);
}

public Object PerformLogic(Request,...)
{
    //multiple IO operations each depends on the outcome of the previous result
    //Computations after getting the result from all I/O operations
}

如果我單獨運行PerformLogic操作(針對1個對象)需要300毫秒,現在我的要求是,當我在單個請求中針對100個對象運行此PerformLogic()時,應該需要2秒鍾左右。

PerformLogic()具有以下步驟-1.調用第三方Web服務以獲取一些詳細信息2.根據詳細信息,調用另一個第三方Web服務3.從Web服務中收集結果,進行少量轉換

但是使用Task.run()大約需要7秒鍾,我想知道處理並發並達到2秒鍾所需NFR的最佳方法。 我可以看到在任何時候7-8個線程可以同時工作

不知道我是否可以生成100個線程或任務,我們可以看到一些更好的性能。 請提出一種有效處理此問題的方法。

從這個判斷

public Object PerformLogic(Request,...)
{
  //multiple IO operations each depends on the outcome of the previous result
  //Computations after getting the result from all I/O operations
}

我敢打賭, PerformLogic將大部分時間都花在等待IO操作上。 如果是這樣,那么async就有希望。 您將不得不重寫PerformLogic甚至可能是IO操作-從上到下的所有級別都必須存在async 但是, 如果可以做到,結果應該會快得多。

除此之外-獲得更快的硬件。 如果8核耗時7秒,則獲得32核。 它很昂貴,但仍可能比重寫代碼便宜。

首先,不要重新發明輪子。 PLINQ完全可以並行處理事務,無需手動任務處理或結果合並。

如果您要100個任務在2秒內完成300毫秒,那么您至少需要15個並行工作器, 而忽略了並行化本身的成本

var results = multiFlightStatusRequest.FlightRequests
                                      .AsParallel()
                                      .WithDegreeOfParallelism(15) 
                                      .Select(flightRequest => PerformLogic(flightRequest, lite, fetchRouteByAnyLeg)
                                      .ToList();

現在,您已經告訴PLinq使用15個並發工作器來處理您的任務隊列。 您確定您的機器可以完成任務嗎? 您可以在其中輸入任何數字,這並不意味着您的計算機可以神奇地執行此操作。

另一個選擇是查看PerformLogic方法並對其進行優化。 您稱之為100次,也許值得優化。

暫無
暫無

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

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