c# - 将 IEnumerable.Aggregate 与异步调用结合使用

标签 c# .net linq asynchronous async-await

我正在尝试使用 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/

相关文章:

c# - 禁用按钮时如何避免颜色变化?

c# - 命令已在进行中

c# - Thread.CurrentCulture 未保存到实例变量?

c# - 无法解析 Unicode CSV 文件

c# - .NET 4.0 是否与 Windows XP SP2 或更低版本兼容?

C# LINQ 复合排序 3 列

linq - ef cf linq 填充被忽略的属性

c# - 添加到 DataSource 时 ListBox 抛出 ArgumentOutOfRangeException

c# - 如何使用 C#.net (VS2012) 访问另一个项目中的类(但在同一解决方案中)

c# - MVC LINQ,其中 UserID 等于经过身份验证的用户