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

Ayb*_*ybe 2 c# linq task-parallel-library async-await

我希望以下语句返回一个IEnumerable的String.

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

DownloadFile前添加await并没有改变任何东西.

被调用方法的签名:

private static async Task<string> DownloadFile(string url, int timeout)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Ste*_*ary 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);
Run Code Online (Sandbox Code Playgroud)