gpt4 book ai didi

c# - 如何在 TransformBlock 之后写入对象?

转载 作者:行者123 更新时间:2023-12-04 19:57:46 25 4
gpt4 key购买 nike

我有一个需要并行迭代的对象列表。这是我需要做的:

foreach (var r in results)
{
r.SomeList = await apiHelper.Get(r.Id);
}

因为我想将它并行化,所以我尝试使用 Parallel.ForEach() 但它不会等到一切都真正完成,因为apiHelper.Get() 在它自己的内部进行等待。

Parallel.ForEach(
results,
async (r) =>
{
r.SomeList = await apiHelper.Get(r.Id);
});

于是在网上搜索了一下,发现了这个: Nesting await in Parallel.ForEach

现在我是 TPL 的新手(20 分钟前),我可能遗漏了一些明显的东西。我该如何继续?

        var getBlock = new TransformBlock<string, List<Something>>(
async i =>
{
var c = await apiHelper.Get(i);
return c;
}, new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
});

foreach (var r in results)
{
r.SomeList = getBlock.Post(r.Id); // ERROR: Can't convert boolean to list.
}

getBlock.Complete();

最佳答案

或许可以考虑改用 Microsoft 的 Reactive Framework。

代码如下:

var query =
from r in results.ToObservable()
from l in Observable.FromAsync(() => apiHelper.Get(r.Id))
select new { r, l };

query
.Subscribe(x => x.r.SomeList = x.l);

完成。并行和异步。

只需 NuGet“System.Reactive”并添加 using System.Reactiive.Linq;

关于c# - 如何在 TransformBlock 之后写入对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50499088/

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