2013-09-28 25 views
2

我希望以下語句返回一個IEnumerable字符串來代替。使此LINQ語句返回T代替任務<T>

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

添加等待前DownloadFile沒有任何改變。該方法的

簽名被稱爲:

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

我怎樣才能做到這一點?

+1

敢肯定這應該是任務>,不IEnumerable的>即任務返回任務,每個返回字符串的IEnumerable 不是一個IEnumerable(?) – Zenilogix

+0

這聽起來更好,是:) – Aybe

回答

9

首先,瞭解您的類型。這將導致您找到正確的解決方案。我假設你熟悉IEnumerable<T>(一系列事物);但Task<T>對許多人來說是新的。 A Task<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);