缓冲块和TPL数据流的行为特性

3

我对缓存块(Bufferblock)和数据流处理有一些问题。假设我设置了以下这样的东西(我从另一个问题复制了这段代码,但它可以说明问题):

var forwarder = new BufferBlock<SomeType>();
forwarder.LinkTo(target1, item => matchesTarget1(item));
forwarder.LinkTo(target2, item => matchesTarget2(item));
forwarder.LinkTo(DataflowBlock.NullTarget<SomeType>());

问题1:假设没有并发设置,如果我向前置器添加1000个与目标1匹配的项目,它们是否都会立即发布到目标1?也就是说,排队是否在目标1内进行,因此转发器(缓冲块)现在为空?我相信是这样,这意味着缓冲区立即清空自己?还是当目标1决定无法处理更多内容时,目标1会拒绝接收内容?

问题2:假设我将Target1的maxdegreeofparallelism设置为4,则我认为这意味着事情会停留在缓冲区中,直到目标能够处理它们。但这是否意味着,如果我的队列看起来像这样:

target1Item

target1Item

target1Item

target1Item

target1Item

target2Item

target2Item

target2Item

那么直到所有5个target1Items被接受之前,target2将不会有任何工作可做。如果target1是一个缓慢的过程,那么这意味着当它可以派上用场时,target2可能会闲置。

我已经反复阅读了相关资料,但仍然找不到明确的答案。任何帮助将不胜感激。谢谢!

1个回答

4

a1. 这取决于目标块的有界容量。默认值为-1(无限制),因此是的,缓冲区将自动清空并将所有项目移动到target1中。如果设置了容量并且已达到,则其余项目将留在缓冲区中。

a2. 据我所知,如果我们假设目标的容量是无限的,那么所有项目都将从缓冲区移动到target1和target2中。仅在target1上设置maxdegreeofparallelism允许并行处理多个项目。


1
对的。所以所有目标块都有一个内部队列,是吗?而BoundedCapacity确定了该队列的大小,而maxdegreeofparalellism只是控制同时尝试处理多少个目标块? - bornfromanegg
@user1158174 差不多。是的。 - i3arnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接