我目前正在与异步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得到一个出OUF越界异常== SortedRecommendations [I] .Aid因为我现在是obvioulsy别的东西,然后它是当下载开始。 唯一的可能我看到的是使用类似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