我最近阅读了一些使用TAP的文档,特别是在较小的标题“Task.WhenAny”下的this page。他们列出了Task.WhenAny:
的4个主要目的在交错(和间接节流)子部分下面,他们有这个代码
List<Task<Bitmap>> imageTasks =
(from imageUrl in urls select GetBitmapAsync(imageUrl)).ToList();
while(imageTasks.Count > 0)
{
try
{
Task<Bitmap> imageTask = await Task.WhenAny(imageTasks);
imageTasks.Remove(imageTask);
Bitmap image = await imageTask;
panel.AddImage(image);
}
catch{}
}
这段代码不是很低效吗?我假设一旦Task.WhenAll的第一个任务完成它,然后将列表中的其他任务设置为“RanToCompletion”或“Canceled”或其他一些会阻止其他任务进度的状态。因此,即使列表中只有2个任务来下载图像,如本示例所示,1个图像为2MB,另一个图像为4MB,超过2MB图像可能首先完成(并且将收到2个MB或另一个) 。然后它将从列表中删除2MB并开始循环。这似乎会再次启动4MB下载,基本上浪费了已经取得的进展,正确吗?
答案 0 :(得分:1)
所有图片下载都会在您调用的同时“GetBitmapAsync&#39;”中同时并行执行。
循环只检查哪些已完成并将它们添加到面板。通过这种方式,您可以在图像到达后立即查看。
任务结束后,不会影响其他任务的状态。