我想知道使用与一个或多个ActionBlock链接的BufferBlock是否有其他好处,而不仅仅是限流(使用BoundedCapacity),而直接将消息发送到ActionBlock(只要不需要限流)。
我想知道使用与一个或多个ActionBlock链接的BufferBlock是否有其他好处,而不仅仅是限流(使用BoundedCapacity),而直接将消息发送到ActionBlock(只要不需要限流)。
如果你只想将项从一个块转发到其他几个块,那么你不需要使用BufferBlock
。
但是,在某些情况下,它是有用的。例如,如果您有一个复杂的数据流网络,您可能希望从较小的子网络构建它,每个子网络在其自己的方法中创建。为此,您需要一种表示块组的方式。在您提到的情况下,从该方法返回单个BufferBlock
(可能作为ITargetBlock
)将是一种简单的解决方案。
另一个BufferBlock
有用的例子是如果您想将项目从多个源块发送到多个目标块。如果您将BufferBlock
用作中介,您就不必将每个源块连接到每个目标块。
我确定还有许多其他例子可以使用BufferBlock
。当然,如果您在您的情况下看不到使用它的原因,则不要使用。
static void Main(string[] args)
{
BufferBlock<int> bb = new BufferBlock<int>();
ActionBlock<int> a1 = new ActionBlock<int>(a =>
{
Thread.Sleep(100);
Console.WriteLine("Action A1 executing with value {0}", a);
});
ActionBlock<int> a2 = new ActionBlock<int>(a =>
{
Thread.Sleep(50);
Console.WriteLine("Action A2 executing with value {0}", a);
});
ActionBlock<int> a3 = new ActionBlock<int>(a =>
{
Thread.Sleep(50);
Console.WriteLine("Action A3 executing with value {0}", a);
});
bb.LinkTo(a1);
bb.LinkTo(a2);
bb.LinkTo(a3);
Task t = new Task(() =>
{
int i = 0;
while (i < 10)
{
Thread.Sleep(50);
i++;
bb.Post(i);
}
}
);
t.Start();
Console.Read();
}
static void Main(string[] args)
{
BufferBlock<int> bb = new BufferBlock<int>();
ActionBlock<int> a1 = new ActionBlock<int>(a =>
{
Thread.Sleep(100);
Console.WriteLine("Action A1 executing with value {0}", a);
}
, new ExecutionDataflowBlockOptions {BoundedCapacity = 1});
ActionBlock<int> a2 = new ActionBlock<int>(a =>
{
Thread.Sleep(50);
Console.WriteLine("Action A2 executing with value {0}", a);
}
, new ExecutionDataflowBlockOptions {BoundedCapacity = 1});
ActionBlock<int> a3 = new ActionBlock<int>(a =>
{
Thread.Sleep(50);
Console.WriteLine("Action A3 executing with value {0}", a);
}
, new ExecutionDataflowBlockOptions {BoundedCapacity = 1});
bb.LinkTo(a1);
bb.LinkTo(a2);
bb.LinkTo(a3);
Task t = new Task(() =>
{
int i = 0;
while (i < 10)
{
Thread.Sleep(50);
i++;
bb.Post(i);
}
});
t.Start();
Console.Read();
}
var a1 = new ActionBlock<int>(
i => doSomeWork(i),
new ExecutionDataflowBlockOptions {BoundedCapacity = 1}
);