C# 如何以较小的批量运行大量任务?

C# 如何以较小的批量运行大量任务?,c#,asynchronous,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) { v

我有很多要异步运行的操作。我有:

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);
}

whalll
不执行任务。它等待他们完成。通常在创建任务后立即开始执行,在您的案例中,当所有的不执行任务时,在
CreateGeoreferencedImageAsync
内。它等待他们完成。通常在创建任务后立即开始执行,在您的案例中,在
CreateGeoreferencedImageAsync
中,忘记任务,尤其是任务.Run()

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


忘记任务,尤其是Task.Run()

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



您的列表包含已启动的任务。绝对没有理由一次等待两个任务。因此,正确的答案可能是,他不应该使用
Task.Run
创建任务,而是
newtask
。也许这会有帮助:为什么不干脆
Task.WaitAll(tasks)
?你想避免什么?我添加了方法代码。我只想运行任务的一部分,因为我没有足够的内存来运行它们。列表中可能存在的重复项包含已启动的任务。绝对没有理由一次等待两个任务。因此,正确的答案可能是,他不应该使用
Task.Run
创建任务,而是
newtask
。也许这会有帮助:为什么不干脆
Task.WaitAll(tasks)
?你想避免什么?我添加了方法代码。我只想运行任务的一部分,因为我没有足够的内存来运行所有的任务。可能的重复意味着我要在上一个任务完成后创建新的任务?这意味着我要在上一个任务完成后创建新的任务?我相信这是一种更老的方法。信号灯将是较新的方式。我可能错了,信号量比并行类要老得多。大约半个世纪了,但SemaphoreSlim不是。现在是你解释为什么使用第三方物流而不是其他选择的机会。我想我明白为什么,但我不希望别人知道。不,这个问题还没有结束。我相信这是一种更古老的方法。信号灯将是较新的方式。我可能错了,信号量比并行类要老得多。大约半个世纪了,但SemaphoreSlim不是。现在是你解释为什么使用第三方物流而不是其他选择的机会。我想我明白为什么,但我不希望别人知道。不,问题还没有结束。
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);
            });
    }
Parallel.For(0, 1000, 
  new ParallelOptions { MaxDegreeOfParallelism = 4 },
  i => CreateGeoreferencedImage(properties, scaleIndex, 
      currentXmin, currentYmin, currentXmax,  currentYmax));