我目前正在使用 Async CTP,需要将此代码转换为可以使用 Task.WhenAll() 的代码。
到目前为止,我所做的是使用 UserState 对象并将我的标识符 (AID) 放入其中,然后在完成的事件中使用它。
但是 wc.DownloadFileTaskAsync 方法没有 UserState 的重载。我能做些什么?
for (int i = 0; i < SortedRecommendations.Count; i++)
{
string tempfilepath = filepath + SortedRecommendations[i].Aid + ".jpg";
if (File.Exists(tempfilepath))
continue;
WebClient wc = new WebClient();
wc.DownloadFileCompleted += (s, e) =>
{
var q = SortedRecommendations.Where(x => x.Aid == (int)e.UserState);
if (q.Count() > 0)
q.First().Image = tempfilepath;
};
wc.DownloadFileAsync(new Uri(SortedRecommendations[i].Image.Replace("t.jpg", ".jpg")), tempfilepath, SortedRecommendations[i].Aid);
}
这基本上是我想出的,但是我在 y.Aid == SortedRecommendations[i].Aid 得到了一个超出范围的异常,因为我现在显然是在下载开始时的其他东西。我看到的唯一其他可能性是使用类似 TaskEx.Run( () => { // 同步下载数据 }; 但我不喜欢这种方法。
for (int i = 0; i < SortedRecommendations.Count; i++)
{
string tempfilepath = filepath + SortedRecommendations[i].Aid + ".jpg";
if (File.Exists(tempfilepath))
continue;
WebClient wc = new WebClient();
wc.DownloadFileCompleted += (s, e) =>
{
var q = SortedRecommendations.Where(x => x.Aid == SortedRecommendations[i].Aid);
if (q.Count() > 0)
q.First().Image = tempfilepath;
};
tasks.Add(wc.DownloadFileTaskAsync(new Uri(SortedRecommendations[i].Image.Replace("t.jpg", ".jpg")), tempfilepath));
}
await TaskEx.WhenAll(tasks);
//Everything finished