現在、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