gpt4 book ai didi

收集结果的 C# ActionBlock 等价物

转载 作者:行者123 更新时间:2023-12-02 17:10:46 26 4
gpt4 key购买 nike

我目前正在使用 ActionBlock 来处理串行启动的异步作业。它可以很好地处理每个发布到它的项目,但无法从每个作业中收集结果列表。

我可以使用什么以线程安全的方式收集我的作业结果?

我的代码目前是这样的:

var actionBlock = new ActionBlock<int> (async i => await Process(i));
for(int i = 0; i < 100; i++)
{
actionBlock.Post(i);
}
actionBlock.Complete();
await actionBlock.Completion;

我试过改用 TransformBlock,但它在等待完成时无限期挂起。完成状态为“WaitingForActivation”。

我的 TransformBlock 代码是这样的:

var transformBlock = new TransformBlock<int, string> (async i => await Process(i));
for(int i = 0; i < 100; i++)
{
actionBlock.Post(i);
}
actionBlock.Complete();
await actionBlock.Completion;
transformBlock.TryReceiveAll(out IList<string> strings);

最佳答案

事实证明 ConcurrentBag 就是答案

var bag = new ConcurrentBag<string>();
var actionBlock = new ActionBlock<int> (async i =>
bag.Add(await Process(i))
);
for(int i = 0; i < 100; i++)
{
actionBlock.Post(i);
}
actionBlock.Complete();
await actionBlock.Completion;

现在 'bag' 中包含所有结果,并且可以作为 IEnumerable 进行访问。

我实际上最终使用的代码使用了 Parallel.ForEach 而不是 ActionBlock。

Parallel.ForEach
(
inputData,
i => bag.Add(await Process(i))
);

这要简单得多,但在性能方面似乎同样不错,并且仍然可以选择限制并行度等。

关于收集结果的 C# ActionBlock 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49389838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com