加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在异步调用中使用IEnumerable.Aggregate

发布时间:2020-12-15 17:51:24 所属栏目:百科 来源:网络整理
导读:我正在尝试使用LINQ IEnumerable.Aggregate函数来创建一个由通过异步调用检索的文件组成的字符串.不是百分之百确定它是可能的,而且我也知道还有其他解决方案,但我想尝试一下. 现在我的代码看起来像这样: private static async Taskstring GetFiles(IEnumera
我正在尝试使用LINQ IEnumerable.Aggregate函数来创建一个由通过异步调用检索的文件组成的字符串.不是百分之百确定它是可能的,而且我也知道还有其他解决方案,但我想尝试一下.

现在我的代码看起来像这样:

private static async Task<string> GetFiles(IEnumerable<string> filePaths)
{
    return filePaths.Aggregate(async (current,path) => current + await GetFile(path));
}

但是方法调用中的“异步”是错误标记,“异步方法的返回必须为void,Task或Task”.我总体上得到了这个错误,但我不确定如何安排这个具体案例来避免它.有任何想法吗?

更新:
只是为了澄清,GetFile()方法确实是异步的,并返回Task< string>:

private static async Task<string> GetFile(string filePath) { ... }

无需进入特定代码,但对于那些感兴趣的人,它使用HttpClient.GetAsync(filePath)并返回其response.Content.ReadAsStringAsync().结果.

解决方法

聚合方法不会异步工作.它不支持基于任务的代理.您需要在调用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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读