我希望以下语句返回 IEnumerable of String 。
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)
我怎样才能做到这一点?
答案 0 :(得分:9)
首先,了解您的类型。这将引导您找到正确的解决方案。我假设你熟悉IEnumerable<T>
(一系列事物);但Task<T>
对很多人来说都是新的。 Task<T>
是 future - 某些操作 将来会有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);
答案 1 :(得分:4)
查看https://github.com/paulcbetts/linqtoawait,我写了一个库来解决这个问题。