2

代わりに、次のステートメントで String の IEnumerableを返すようにしたいと思います。

IEnumerable<Task<string>> @select = artist.Reviews.Select(async s => await DownloadFile(s.ImageUrl,1000));

DownloadFileの前にawaitを追加しても、何も変わりませんでした。

呼び出されるメソッドの署名:

private static async Task<string> DownloadFile(string url, int timeout)

どうすればこれを達成できますか?

4

2 に答える 2

9

まず、自分のタイプを理解してください。それが正しい解決へと導いてくれます。あなたはIEnumerable<T>(一連のこと)に精通していると思います。しかしTask<T>、多くの人にとっては新しいものです。ATask<T>未来です -将来のある時点でタイプの結果持つ操作です。T

IEnumerable<Task<string>>(文字通り、文字列の結果を持つ一連の先物) があり、(IEnumerable<string>文字通り、文字列のシーケンス) が必要な場合、すべての先物が完了するまで (非同期で) 待ちます。

次を使用して、複数の先物を (非同期で) 待つことができますTask.WhenAll

IEnumerable<Task<string>> @select = artist.Reviews.Select(s => DownloadFile(s.ImageUrl,1000));
string[] results = await Task.WhenAll(@select);
于 2013-09-28T23:30:18.613 に答える
4

https://github.com/paulcbetts/linqtoawaitを確認してください。この問題に正確に対処するためのライブラリを作成しました。

于 2013-09-28T23:40:46.027 に答える