C# 第三方物流区块与循环链接?

C# 第三方物流区块与循环链接?,c#,task-parallel-library,tpl-dataflow,dataflow,C#,Task Parallel Library,Tpl Dataflow,Dataflow,我经常使用TPL,并且具有大数据流管道结构。 作为管道网络的一部分,我想将一些数据写入azure blob存储。我们有很多数据,因此我们有4个存储帐户,我们希望在它们之间平均分配数据 想要继续使用数据流管道模式,因此我想要实现一个SourceBlock,如果我将它链接到几个目标块,它将通过循环向它们发送消息BufferBlock不够好,因为他将消息发送到接受它的第一个块,并且假设所有目标块都有较大的有界容量-所有消息都将发送到第一个目标块广播块也不好,因为我不想要重复的 有什么建议吗?用roun

我经常使用TPL,并且具有大数据流管道结构。
作为管道网络的一部分,我想将一些数据写入azure blob存储。我们有很多数据,因此我们有
4个
存储帐户,我们希望在它们之间平均分配数据

想要继续使用数据流管道模式,因此我想要实现一个
SourceBlock
,如果我将它链接到几个目标块,它将通过循环向它们发送消息
BufferBlock
不够好,因为他将消息发送到接受它的第一个块,并且假设所有目标块都有较大的有界容量-所有消息都将发送到第一个目标块<代码>广播块
也不好,因为我不想要重复的


有什么建议吗?用round Robbing行为实现
ISourceBlock
接口似乎不是那么简单,我想知道是否有更简单的解决方案?或者我不熟悉的第三方物流的任何扩展?

您是否意识到这种可能性?这是一种非常简单且未经测试的样品溶液:

var buffer = new BufferBlock<int>();
var consumer1 = new ActionBlock<int>(i => Console.WriteLine($"First: {i}"));
var consumer2 = new ActionBlock<int>(i => Console.WriteLine($"Second: {i}"));
var consumer3 = new ActionBlock<int>(i => Console.WriteLine($"Third: {i}"));
var consumer4 = new ActionBlock<int>(i => Console.WriteLine($"Forth: {i}"));

buffer.LinkTo(consumer1, i => Predicate(0));
buffer.LinkTo(consumer2, i => Predicate(1));
buffer.LinkTo(consumer3, i => Predicate(2));
buffer.LinkTo(consumer4, i => Predicate(3));
buffer.LinkTo(DataflowBlock.NullTarget<int>());

for (var i = 0; i < 10; ++i)
{
    buffer.Post(i);
}
buffer.Completion.Wait();

这里要做的是保持操作次数,如果电流适合耗电元件,我们只需增加。请注意,为了避免内存问题,您仍然应该至少链接一次不带任何谓词的块(另外,最好使用监视丢失消息的块测试循环)。

谢谢VMAtm。我以前从未尝试过传递谓词,我从您的示例中学到了很多。仍然不确定它是否适用于我的情况。但也许我错过了什么,因为我没有完全理解它。所以有一个问题——你写了“注意,为了避免内存问题,你至少应该链接一次没有任何谓词的块”。你能解释一下你的意思是什么内存问题吗?正如我所说,这段代码没有经过正确的测试,而且,可能在某种情况下,所有谓词都返回false。在此之后,消息将保留在
BufferBlock
中,直到程序结束。通常的做法是为“坏”消息创建一个块以离开biffer
NullTarget
只是忽略消息,但您可以使用任何喜欢的块并记录所有谓词未命中。
Third: 2
First: 0
Forth: 3
Second: 1
Second: 5
Second: 9
Third: 6
Forth: 7
First: 4
First: 8