批量运行任务

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)

Ňuf*_*Ňuf 5

我的理解是否正确,在 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)