首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中收集并行异步任务的结果?

如何在C#中收集并行异步任务的结果?
EN

Stack Overflow用户
提问于 2022-02-02 18:29:51
回答 1查看 763关注 0票数 1

实际上,我在异步任务上遇到了并行性问题。

我的目标是拥有一个异步Task,它连接到多个端点以检索相同类型的数据。提供了一个包含所有“连接字符串”的列表。数据检索应与所有连接并行进行,每个连接的检索数据将合并到一个容器中,一旦所有并行异步任务完成,该容器将被返回。

我的第一个想法是使用AsParallel.ForAll() -传递配置,并使用异步任务来用SendAsync填充(Dataflow) BufferBlock。现在我被困在这个问题上了,Parallel查询似乎只使用Action<T>作为参数,而不是Task<T>。如果出现异常,这将导致不想要的行为。

有没有人能更好地解决我的问题?

下面是一个用于更好的可视化的片段:

代码语言:javascript
复制
configurations.AsParallel().ForAll(async config => await FetchAllData(config,
    resultBufferBlock, cancellationToken));

经过一些评论之后:我基本上需要Parallel.ForEachAsync,这是在.NET 6中提供的。我们将在几个月后移到.NET 6。这已经计划好了。虽然我希望为.NET 5提供一个解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-03 05:04:28

--实际上,我在异步任务上遇到了并行性问题。

您描述的问题是并发性(一次做不止一件事情),而AFAICT不需要并行性(多线程)。

,有人有更好的方法来解决我的问题吗?

异步并发的方法是启动所有任务(通常使用LINQ和异步lambda),然后使用Task.WhenAll连接它们。

代码语言:javascript
复制
var tasks = configurations.Select(async config => await FetchAllData(config, resultBufferBlock, cancellationToken));
await Task.WhenAll(tasks);

经过一些评论之后:我基本上需要Parallel.ForEachAsync,这在.NET 6中是可用的。

我不同意。Parallel.ForEachAsync适用于复杂的CPU绑定代码和I/O绑定代码的混合,并且需要同时执行并行和异步并发。在这种情况下,并行性是不必要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70960918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档