我最近正在阅读一些文档,以使用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'的瞬间同时同时执行所有图像下载。
循环只需检查完成的循环,然后将其添加到面板中。这样,您就可以看到图像到达后立即看到。
一旦任务结束,它就不会影响其他任务的状态。