使此LINQ语句返回T而不是Task <t> </t>

时间:2013-09-28 23:09:44

标签: c# linq task-parallel-library async-await

我希望以下语句返回 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)

我怎样才能做到这一点?

2 个答案:

答案 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,我写了一个库来解决这个问题。