kor*_*inp 0 c# task task-parallel-library
我试图理解 System.Task,但我不确定我所做的是否正确。我的目标是编写一种方法来批量并行处理图像。
我的理解是否正确,如果batchSize = 3该方法将排队 3 个任务并尽快并行运行所有 3 个任务Task.WaitAll()在调用时?
如果这样做有没有更优雅的方法?
private static void ProcessImages(int batchSize)
{
List<Task> tasks = new List<Task>();
foreach (var image in ImageSource.ReadImages())
{
if(tasks.Count < batchSize)
{
tasks.Add(Task.Run(() => ImageProcessor.ProcessImage(image)));
}
else
{
Task.WaitAll(tasks.ToArray());
tasks.Clear();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的理解是否正确,在 batchSize = 3 的情况下,该方法将在调用 Task.WaitAll() 时将 3 个任务排队并并行运行所有 3 个任务?
虽然将任务添加到列表然后添加Task.WaitAll()这些任务的想法是正确的,但不幸的是,您的代码存在错误并且无法按预期工作。具体来说,它不会为每个批次之后的图像执行任务,也不会为最后一批中的图像执行任务,如果图像数量不能被 整除batchSize+1。
如果这样做有没有更优雅的方法?
幸运的是,批量执行任务是非常普遍的要求,因此 .NET 已经包含了使它更容易的方法。使用PLINQ就这么简单:
ImageSource.ReadImages()
.AsParallel()
.WithDegreeOfParallelism(batchSize)
.ForAll(image => ImageProcessor.ProcessImage(image));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |