如何批量运行许多较小的任务?

时间:2018-10-01 11:47:07

标签: c# asynchronous

我想进行异步操作有很多操作。我这样做:

var tasks = new List<Task<bool>>();

for(var i=0;i<1000;i++){
  tasks.Add(CreateGeoreferencedImageAsync(properties, scaleIndex, currentXmin, currentYmin, currentXmax, currentYmax));
}

while (tasks.Count > 0)
{
   var bunch = tasks.Take(4).ToList();
   bool[] firstFinishedTask = await Task.WhenAll(bunch);
   tasks.RemoveRange(0,4);
}

但是我看到WhenAll不仅从tasks执行了bunch的所有任务。
我错过了什么?

更新

private Task<bool> CreateGeoreferencedImageAsync(ImageGenerationProperties 
properties, int scaleIndex,
        double currentXmin, double currentYmin, double currentXmax, double currentYmax)
    {
        return Task.Run(() =>
            {
                return CreateGeoreferencedImage(properties, scaleIndex, currentXmin, currentYmin, currentXmax,
                    currentYmax);
            });
    }

2 个答案:

答案 0 :(得分:3)

WhenAll不执行任务。它等待他们完成。通常,任务一创建就开始执行,在您的情况下,则在CreateGeoreferencedImageAsync中执行。

答案 1 :(得分:3)

忘记Tasks,尤其是Task.Run()。

最好使用Parallel.ForEach()解决此问题。或Linq的AsParallel()

Parallel.For(0, 1000, 
  new ParallelOptions { MaxDegreeOfParallelism = 4 },
  i => CreateGeoreferencedImage(properties, scaleIndex, 
      currentXmin, currentYmin, currentXmax,  currentYmax));