实际上,我在异步任务上遇到了并行性问题。
我的目标是拥有一个异步Task,它连接到多个端点以检索相同类型的数据。提供了一个包含所有“连接字符串”的列表。数据检索应与所有连接并行进行,每个连接的检索数据将合并到一个容器中,一旦所有并行异步任务完成,该容器将被返回。
我的第一个想法是使用AsParallel.ForAll() -传递配置,并使用异步任务来用SendAsync填充(Dataflow) BufferBlock。现在我被困在这个问题上了,Parallel查询似乎只使用Action<T>作为参数,而不是Task<T>。如果出现异常,这将导致不想要的行为。
有没有人能更好地解决我的问题?
下面是一个用于更好的可视化的片段:
configurations.AsParallel().ForAll(async config => await FetchAllData(config,
resultBufferBlock, cancellationToken));经过一些评论之后:我基本上需要Parallel.ForEachAsync,这是在.NET 6中提供的。我们将在几个月后移到.NET 6。这已经计划好了。虽然我希望为.NET 5提供一个解决方案。
发布于 2022-02-03 05:04:28
--实际上,我在异步任务上遇到了并行性问题。
您描述的问题是并发性(一次做不止一件事情),而AFAICT不需要并行性(多线程)。
,有人有更好的方法来解决我的问题吗?
异步并发的方法是启动所有任务(通常使用LINQ和异步lambda),然后使用Task.WhenAll连接它们。
var tasks = configurations.Select(async config => await FetchAllData(config, resultBufferBlock, cancellationToken));
await Task.WhenAll(tasks);经过一些评论之后:我基本上需要Parallel.ForEachAsync,这在.NET 6中是可用的。
我不同意。Parallel.ForEachAsync适用于复杂的CPU绑定代码和I/O绑定代码的混合,并且需要同时执行并行和异步并发。在这种情况下,并行性是不必要的。
https://stackoverflow.com/questions/70960918
复制相似问题