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

create async method that calulate the sum and limit numbers of threads

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

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

I'm trying to create a async method in my c# application and want to make it with limited threads the method should calculate the sum of many arrays each array in separate threads, but if we have more than 4 like 6 arrays, first you run 4 threads and once a thread is released you need to run one more and so on.

首先:异步与并行完全不同,尽管它们都是并发形式。异步的重点是使用更少个线程,而并行是使用更多个线程。

由于您正在处理 CPU-bound 操作(对值求和),因此您需要并行性,而不是异步性。 Parallel 和 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));