创建计算总和和限制线程数的异步方法
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线程,那么你可以使用await
和Task.Run
这样的:
// Run BestRoute on a thread pool thread to avoid blocking the UI
var minValue = await Task.Run(() => BestRoute(routes));
我正在尝试在我的 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线程,那么你可以使用await
和Task.Run
这样的:
// Run BestRoute on a thread pool thread to avoid blocking the UI
var minValue = await Task.Run(() => BestRoute(routes));