- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这个代码:
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();
这段代码得到了这个输出:
[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?
最佳答案
ActionBlock
似乎具有有限并行度的原因是因为它的 BoundedCapacity
为 1。BoundedCapacity
(与 InputCount
) 包括当前正在处理的项目。这可以很容易地证明:
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
时,该 block 当时不能接受超过一个项目,因此实际上限制了您的并行度。
您可以通过设置更大的 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
});
关于c# - 具有 BoundedCapacity 的 BufferBlock 和 ActionBlock 不使用最大 DOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26577051/
目前我想为游戏机优化我的 3d 引擎。更准确地说,我希望对缓存更加友好,并使我的结构更加面向数据,但也希望保留我漂亮的用户界面。 例如: bool Init() { // Create a nod
我最近发现下面的代码可以有效地运行大量 I/O 绑定(bind)任务: Implementing a simple ForEachAsync, part 2 我的印象是以下内容是真实的: 这比使用 P
我正在使用 SensorLog 应用从 iPhone 6 收集数据。其他设备提供我在算法中使用的 GPS_DOP(GPS 精度稀释)的输出。但是,SensorLog 提供locationVertica
我需要删除一些 FK 约束以删除表中的一行,但我想在删除后将其添加回来,但是当我尝试将其添加回时出现此错误: 无法添加或更新子行:外键约束失败... 我知道当您尝试插入不存在的相应键时会发生此错误,但
现在经过一些工作,我终于了解了 KDop 边界体积是如何创建的以及碰撞是如何相交的,并且我对它们进行了工作实现。现在的问题是另一个。 :D 我怎样才能相交(它必须是可能的,否则没有任何意义)2 个不同
我有这个代码: var data = new BufferBlock(new DataflowBlockOptions { BoundedCapacity = 1 }); var action = n
我正在尝试使用 numpy 1.9.3 在 Python 2.7.2 中计算一组 GPS 卫星的 DOP 值。 我找到了一个 guide关于如何执行此操作,但我无法将其转换为 python。 这是我到
我是一名优秀的程序员,十分优秀!