任务.当时节流效率



我最近正在阅读一些文档,以使用TAP,特别是在较小的标题" 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{}
}

此代码不会效率低下吗?我的假设是一旦任务。Whenall的第一个任务完成它,然后将列表中的其他任务设置为" rantocompletion"或"已取消"或其他一些状态,以杀死其他任务的进度。因此,即使列表中只有2个任务即可下载图像,如本示例,其中1个图像为2MB,另一个图像为2MB,而2MB映像的可能性很大(以及2ish MB或另一个将收到))。然后,它将从列表中删除2MB并开始循环。似乎它将再次开始4MB下载,从本质上浪费了已经取得的进展,正确?

在您调用'getBitMapAsync'的瞬间同时同时执行所有图像下载。

循环只需检查完成的循环,然后将其添加到面板中。这样,您就可以看到图像到达后立即看到。

一旦任务结束,它就不会影响其他任务的状态。

最新更新