Task.WhenAny限制效率

时间:2016-11-26 23:09:35

标签: c# asynchronous async-await task-parallel-library

我最近阅读了一些使用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下载,基本上浪费了已经取得的进展,正确吗?

1 个答案:

答案 0 :(得分:1)

所有图片下载都会在您调用的同时“GetBitmapAsync&#39;”中同时并行执行。

循环只检查哪些已完成并将它们添加到面板。通过这种方式,您可以在图像到达后立即查看。

任务结束后,不会影响其他任务的状态。