创建异步方法,计算线程的总数和限制数



我正试图在我的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);
}

我的工作方法正确吗?我怎么能不受线程限制呢?这是我第一次在里面工作,不知道该怎么拖延,有什么帮助或想法吗?

我正试图在我的c#应用程序中创建一个异步方法,并希望使其具有有限的线程。该方法应该计算多个数组的总和,每个数组在单独的线程中,但如果我们有4个以上(如6个(的数组,则首先运行4个线程,一旦释放一个线程,则需要再运行一个,以此类推。

第一:异步与并行有很大不同,尽管它们都是并发的形式。异步的全部目的是使用更少的线程,并行是使用更多的线程。

由于您处理的是CPU绑定操作(求和值(,因此需要并行性,而不是异步性。CCD_ 1和PLINQ是合适的工具。通常,如果您有一个结果(或一系列结果(,PLINQ会更干净一些。Parallel和PLINQ都支持限制线程数。

public int BestRoute(List<Route> Routes)
{
return Routes.AsParallel()
.WithDegreeOfParallelism(4)
.Select(CalculateRouter)
.Min();
}

如果需要异步,例如,如果你需要释放UI线程,那么你可以使用awaitTask.Run如下:

// Run BestRoute on a thread pool thread to avoid blocking the UI
var minValue = await Task.Run(() => BestRoute(routes));

最新更新