使此 LINQ 语句返回 T 而不是 Task

本文关键字:Task LINQ 语句 返回 使此 | 更新日期: 2023-09-27 18:33:07

我希望以下语句返回字符串的 IEnumerable

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

下载文件前面添加等待并没有改变任何内容。

被调用方法的签名:

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

我怎样才能做到这一点?

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

首先,了解你的类型。这将引导您找到正确的解决方案。我假设你熟悉IEnumerable<T>(一系列事情);但Task<T>对许多人来说是新的。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);

查看 https://github.com/paulcbetts/linqtoawait,我写了一个库来解决这个问题。