2

我希望下面的语句返回一个字符串的 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 回答