我正在尝试使用 LINQ IEnumerable.Aggregate 函数来创建一个由通过异步调用检索到的文件组成的字符串。不能百分百确定这是可能的,而且我也知道还有其他解决方案,但我想试一试。
现在我的代码是这样的:
private static async Task<string> GetFiles(IEnumerable<string> filePaths)
{
return filePaths.Aggregate(async (current, path) => current + await GetFile(path));
}
但是方法调用中的“async”被错误标记为“异步方法的返回必须是 void、Task 或 Task”。我一般都会遇到这个错误,但我不确定如何安排这个特定案例来避免它。有什么想法吗?
更新:
澄清一下,GetFile() 方法确实是异步的并返回 Task<string>
:
private static async Task<string> GetFile(string filePath) { ... }
无需进入具体代码,但对于那些感兴趣的人,它使用 HttpClient.GetAsync(filePath)
并返回其 response.Content.ReadAsStringAsync().Result
.
最佳答案
Aggregate
方法不会异步工作。它不支持基于任务的委托(delegate)。您需要自己创建一个结果序列,方法是在调用 Aggregate
方法之前等待它。
像这样的东西应该可以工作:
private static async Task<string> GetFiles(IEnumerable<string> filePaths)
{
var files = filePaths
.Select(p => GetFile(p))
.ToArray();
var results = await Task.WhenAll(files);
return results
.Aggregate((current, path) => current + path);
}
关于c# - 将 IEnumerable.Aggregate 与异步调用结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28585460/