具有BoundedCapacity的BufferBlock和ActionBlock不使用最大DOP

编程入门 行业动态 更新时间:2024-10-24 12:29:57
本文介绍了具有BoundedCapacity的BufferBlock和ActionBlock不使用最大DOP的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有此代码:

var data = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 1 }); var action = new ActionBlock<int>(async id => { Console.WriteLine("[{0:T}] #{1}: Start", DateTime.Now, id); await Task.Delay(1000); Console.WriteLine("[{0:T}] #{1}: End", DateTime.Now, id); }, new ExecutionDataflowBlockOptions { BoundedCapacity = 1, MaxDegreeOfParallelism = -1 }); data.LinkTo(action, new DataflowLinkOptions { PropagateCompletion = true }); for (var id = 1; id <= 3; id++) { Console.WriteLine("[{0:T}] Sending {1}", DateTime.Now, id); data.SendAsync(id).Wait(); Console.WriteLine("[{0:T}] Sending {1} complete", DateTime.Now, id); } data.Complete(); Task.WhenAll(data.Completion, action.Completion).Wait();

这段代码为我提供了此输出:

And this code gets me this output:

[22:31:22] Sending 1 [22:31:22] Sending 1 complete [22:31:22] Sending 2 [22:31:22] #1: Start [22:31:22] Sending 2 complete [22:31:22] Sending 3 [22:31:23] #1: End [22:31:23] #2: Start [22:31:23] Sending 3 complete [22:31:24] #2: End [22:31:24] #3: Start [22:31:25] #3: End

ActionBlock为什么具有不受限制的DOP不能并行工作?

Why isn't ActionBlock working in parallel even though it has an unbounded DOP?

推荐答案

您的ActionBlock似乎具有有限的并行度的原因是因为它的BoundedCapacity为1.BoundedCapacity(不同于)包括当前正在处理的项目.这很容易证明:

The reason your ActionBlock seems to be have a limited degree of parallelism is because it has a BoundedCapacity of 1. BoundedCapacity (unlike InputCount) includes the item being processed at the moment. This can be easily demonstrated:

var block = new ActionBlock<int>(_ => Task.Delay(-1), new ExecutionDataflowBlockOptions { BoundedCapacity = 1, MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded }); await block.SendAsync(4); // Adds a new item await block.SendAsync(4); // Blocks forever

这意味着当您设置MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded时,该块不能同时接受多个项目,因此实际上限制了您的并行度.

That means that while you set MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded the block can't accept more than a single item at the time and so practically limiting your degree of parallelism.

您可以通过设置更大的BoundedCapacity来解决此问题:

You can fix that by setting a larger BoundedCapacity:

var action = new ActionBlock<int>(async id => { Console.WriteLine("[{0:T}] #{1}: Start", DateTime.Now, id); await Task.Delay(1000); Console.WriteLine("[{0:T}] #{1}: End", DateTime.Now, id); }, new ExecutionDataflowBlockOptions { BoundedCapacity = 10, MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded });

更多推荐

具有BoundedCapacity的BufferBlock和ActionBlock不使用最大DOP

本文发布于:2023-11-17 03:16:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1608618.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:BufferBlock   BoundedCapacity   DOP   ActionBlock

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!