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