BufferBlock<T> -> ActionBlock<T> 未触发
BufferBlock<T> -> ActionBlock<T> Not Firing
简而言之
我创建了一个 BatchBlock,它链接到一个调用异步方法的 ActionBlock,但是这个方法永远不会触发。
详情
这是我创建块的方法
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);
保存方法如下所示:
internal async Task Save(IEnumerable<LandingPageConnection> pages)
{
Trace.WriteLine("Inserting " + pages.Count() + " items ...");
await repo.InsertBatchAsync(pages);
}
元素(大约 1 mio)在 Parallel.ForEach
内排队。
Parallel.ForEach(cities, city=>
{
var pages= BuildLandingPage(city);
batch.Post(pages);
但保存方法从未被引发
当我查看批处理和 saveAction 的 属性 时,我可以看到批处理块的未输入队列中的项目数量首先增加,直到达到批处理块大小。之后,具有 10.000 个工作项的一项在 saveACtion 输入队列中排队。
但是永远不会调用保存。
我做错了什么?
解决办法在评论里。原因是生产者创建了很多线程,这就是为什么消费者永远没有机会开火的原因。
简而言之
我创建了一个 BatchBlock,它链接到一个调用异步方法的 ActionBlock,但是这个方法永远不会触发。
详情
这是我创建块的方法
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);
保存方法如下所示:
internal async Task Save(IEnumerable<LandingPageConnection> pages)
{
Trace.WriteLine("Inserting " + pages.Count() + " items ...");
await repo.InsertBatchAsync(pages);
}
元素(大约 1 mio)在 Parallel.ForEach
内排队。
Parallel.ForEach(cities, city=>
{
var pages= BuildLandingPage(city);
batch.Post(pages);
但保存方法从未被引发
当我查看批处理和 saveAction 的 属性 时,我可以看到批处理块的未输入队列中的项目数量首先增加,直到达到批处理块大小。之后,具有 10.000 个工作项的一项在 saveACtion 输入队列中排队。
但是永远不会调用保存。
我做错了什么?
解决办法在评论里。原因是生产者创建了很多线程,这就是为什么消费者永远没有机会开火的原因。