BufferBlock和TPL数据流行为

时间:2014-02-08 13:21:48

标签: c# .net task-parallel-library tpl-dataflow

我有一些关于Bufferblock和Dataflow处理的问题 一般。假设我有一个类似下面的东西(我 从另一个问题复制了这段代码,但它用于说明)

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

Q1。假设没有并发设置,如果我添加1000个匹配项 Target1到转发器,它们是否都立即发布到target1? 即排队是否发生在target1内,因此转发器(BufferBlock)现在是空的?我相信是的,这意味着缓冲区会立即清空自己?或者,当target1决定它无法再应对时,它会拒绝吗?

Q2。假设我将target1的maxdegreeofparallelism设置为4,I 相信这意味着事情会一直停留在缓冲区中 target能够处理它们。但这是否意味着,如果我的话 队列看起来像这样,例如:

target1Item

target1Item

target1Item

target1Item

target1Item

target2Item

target2Item

target2Item

然后,在所有5个之前,target2将不会被提供任何事情 target1Items已被接受。如果target1是一个缓慢的过程,那 意味着target2可能会无所事事 使自己有用。

我已阅读并阅读此内容,但我找不到任何内容 明确地回答这个问题。任何帮助将不胜感激。 感谢

1 个答案:

答案 0 :(得分:3)

A1。这取决于目标块的有界容量。默认值为-1(无界),所以是的,缓冲区将自行清空并将所有项目移动到target1。如果它有一个容量集,并且已达到,那么剩下的项目将保留在缓冲区中。

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