【发布时间】:2022-02-03 13:04:28
【问题描述】:
我实际上面临异步任务的并行性问题。
我的目标是拥有一个异步Task,它连接到多个端点以检索相同类型的数据。提供了一个包含所有“连接字符串”的列表。数据检索应与所有连接并行发生,并且每个连接的检索数据应合并到一个容器中,一旦所有并行异步任务完成,该容器将被返回。
我的第一个想法是使用AsParallel.ForAll() - 传递配置和一个异步任务来用SendAsync 填充(数据流)BufferBlock。现在我陷入了这个问题,Parallel 查询似乎只将Action<T> 作为参数而不是Task<T>。如果发生异常,这将导致不良行为。
有人有更好的方法解决我的问题吗?
这是一个更好的可视化的 sn-p:
configurations.AsParallel().ForAll(async config => await FetchAllData(config,
resultBufferBlock, cancellationToken));
经过一些 cmets:我基本上需要 .NET 6 中提供的 Parallel.ForEachAsync。我们将在几个月后迁移到 .NET 6。这是已经计划好的。虽然我很欣赏 .NET 5 的解决方案。实际上,看起来我会使用不好的方式将任务用作 Action 并稍后修复它......
【问题讨论】:
-
这是您要找的吗?
Parallel.ForEachAsyncdocs.microsoft.com/en-us/dotnet/api/… -
@maksymiuk 我最近了解到
Parallel.ForEachAsync是.net 6 (它被标记为.net 5) -
@maksymiuk 是的!没有遇到这个问题,因为它是 .Net 6,目前我们在 .Net 5 上。我已经很高兴在 .Net 6 中解决了这个问题。无论如何,在我们迁移到 .NET 6 之前我需要一个解决方案(我们可能会在几个月内完成)。
-
还有 ForEachAsync 的 .NET 6 实现的实际源代码:github.com/dotnet/runtime/blob/main/src/libraries/…
标签: c# asynchronous task-parallel-library .net-5 parallel.foreach