为何有界BroadcastBlock与BufferBlock的Post方法返回结果不同?
BroadcastBlock Post返回值与BufferBlock差异:预期行为而非Bug
这是预期行为,并非Bug,核心原因是BroadcastBlock和BufferBlock的设计逻辑完全不同:
两者的核心差异
- BufferBlock:是一个有界队列式缓冲区,
BoundedCapacity直接限制了它能容纳的元素总数。当缓冲区已满时,新的Post操作会被直接拒绝,返回false,因为没有多余空间存储新元素。 - BroadcastBlock:是用于向多个目标块广播元素的块,它的
BoundedCapacity控制的是内部缓存的最新元素数量,而非可接收的元素总数。当新元素到来且缓存已满时,它会自动丢弃最旧的元素来容纳新元素,因此Post操作只要块未处于完成/故障状态,始终会返回true。
对应代码示例分析
在你的代码中:
BufferBlock设置BoundedCapacity=2,前两次Post填满缓冲区,第三次Post因无空间返回false,符合预期。BroadcastBlock同样设置BoundedCapacity=2,第三次Post时,它会丢弃第一个1,保留后两个1,因此Post操作成功,返回true,导致断言失败。
完整代码示例
var block2 = new BufferBlock<int>(new DataflowBlockOptions { BoundedCapacity = 2 }); var result2 = block2.Post(1); result2 = block2.Post(1); Debug.Assert(result2 == true); result2 = block2.Post(1); Debug.Assert(result2 == false); // 符合预期,正常生效 var block1 = new BroadcastBlock<int>(i => i, new DataflowBlockOptions { BoundedCapacity = 2}); var result1 = block1.Post(1); result1 = block1.Post(1); Debug.Assert(result1 == true); result1 = block1.Post(1); Debug.Assert(result1 == false); // 断言失败,因为BroadcastBlock允许替换旧元素,Post返回true
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

