C# 缓冲块<;T>-&燃气轮机;ActionBlock<;T>;不开火
简言之 我创建了一个BatchBlock,它链接到一个ActionBlock,ActionBlock调用一个异步方法,但这个方法从不触发 详细信息 下面是我如何创建块的C# 缓冲块<;T>-&燃气轮机;ActionBlock<;T>;不开火,c#,task-parallel-library,tpl-dataflow,dataflow,C#,Task Parallel Library,Tpl Dataflow,Dataflow,简言之 我创建了一个BatchBlock,它链接到一个ActionBlock,ActionBlock调用一个异步方法,但这个方法从不触发 详细信息 下面是我如何创建块的 var instance = new ConnectionSaveStep(repo, progress, total); var batch = new BatchBlock<LandingPageConnection>(10000); saveAction = ne
var instance = new ConnectionSaveStep(repo, progress, total);
var batch = new BatchBlock<LandingPageConnection>(10000);
saveAction = new ActionBlock<IEnumerable<LandingPageConnection>>(i => instance.Save(i));
batch.LinkTo(saveAction);
但是save方法从未被提出
当我查看batch和saveAction的属性时,我可以看到,首先,batch块的unput队列中的项目数在不断增加,直到达到batchblock大小。之后,一个包含10.000个工作项的项在saveACtion输入队列中排队
但拯救永远不会被调用
我做错了什么?答案在评论中。原因是制作人创建了许多线程,这就是为什么消费者从来没有机会开火。如果不使用
并行,它能工作吗。ForEach
?好主意,我来试一试。但从我的经验来看,这也应该适用于每种类型的并行代码。您的代码中没有任何问题。但是可能是并行的。ForEach完全占据了线程池
,并且没有为操作块
留出空间。嗯,是的,也许我也会尝试限制线程的数量。你是对的,但我主要想理解为什么它不起作用。原因是在我发布的代码下面有一个小代码片段,它引发了一个nullrefence异常
internal async Task Save(IEnumerable<LandingPageConnection> pages)
{
Trace.WriteLine("Inserting " + pages.Count() + " items ...");
await repo.InsertBatchAsync(pages);
}
Parallel.ForEach(cities, city=>
{
var pages= BuildLandingPage(city);
batch.Post(pages);