我想进行异步操作有很多操作。我这样做:
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);
});
}
答案 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));