我正在嘗試在我的 c# 應用程式中創建一個異步方法,并希望使用有限的執行緒來實作該方法應該計算多個陣列的總和,每個陣列在單獨的執行緒中,但是如果我們有超過 4 個像 6 個陣列,首先你運行4個執行緒,一旦一個執行緒被釋放,你需要再運行一個,依此類推。
這是我的代碼:
static int CalculateRouter(Route route)
{
int total = route.sum(route.routers);
return total;
}
通過計算單獨執行緒中每個路由所需的總時間來異步計算最佳路由的異步方法。
public async Task <int> AsyncBestRoute(List<Route> Routes)
{
var tasks = new List<Task<int>>();
foreach (var route in Routes)
{
tasks.Add(Task.Run(() => CalculateRouter(route)));
}
int[] results = await Task.WhenAll(tasks);
int minValue = results.Min();
Console.WriteLine(minValue);
Console.WriteLine("********************");
return await Task.FromResult(minValue);
}
我的作業在方法上是否正確?我怎么能但執行緒的限制?這是我第一次在其中作業,不知道我應該如何延遲它,有什么幫助或想法嗎?
uj5u.com熱心網友回復:
我正在嘗試在我的 c# 應用程式中創建一個異步方法,并希望使用有限的執行緒來實作該方法應該計算多個陣列的總和,每個陣列在單獨的執行緒中,但是如果我們有超過 4 個像 6 個陣列,首先你運行4個執行緒,一旦一個執行緒被釋放,你需要再運行一個,依此類推。
首先:異步與并行完全不同,盡管它們都是并發的形式。異步的全部意義在于使用更少的執行緒,而并行性的意義在于使用更多的執行緒。
由于您正在處理受 CPU 限制的操作(求和值),因此您需要并行性,而不是異步性。Parallel和 PLINQ 是這里的合適工具。通常,如果您有結果(或結果序列),PLINQ 會更簡潔一些。和 PLINQ都Parallel支持限制執行緒數。
public int BestRoute(List<Route> Routes)
{
return Routes.AsParallel()
.WithDegreeOfParallelism(4)
.Select(CalculateRouter)
.Min();
}
如果您還需要異步,例如,如果您需要釋放 UI 執行緒,那么您可以使用awaitand Task.Run:
// Run BestRoute on a thread pool thread to avoid blocking the UI
var minValue = await Task.Run(() => BestRoute(routes));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/437398.html
