而不是直接发布到ActionBlock(只要不需要限制)。如果您只想将项目从一个块转发到其他几个块,则不需要BufferBlock。但是肯定会有一些有用的案例。例如,如果您有一个复杂的数据流网络,您可能希望从较小的子网络构建它,每个子网络都使用自己的方法创建。为此,您需要某种方式来表示一组块。在您提到的情况下,从该方法返回单个BufferBlock(可能是ITargetBlock)将是一个简单的解决方案。BufferBlock有用的另一个例子是,如果你想将项目从多个源块发送到多个目标块。如果您使用BufferBlock作为中介,则BufferBlock的每个源块都连接到每个目标块。我敢肯定还有许多其他使用BufferBlock的示例。当然,如果您看不出有任何理由在您的情况下使用它,那就不要使用它。为了补充svick的答案,缓冲块还有另一个好处。如果您有一个具有多个输出链接的块并且想要平衡它们,则必须将输出块变为非贪婪并添加缓冲块来处理排队。我发现以下示例很有用:引用一个现已失效的链接:这是我们计划做的事情:请注意,BufferBlock不会将输入数据的副本切换到它链接到的所有目标块。相反,只对一个目标块执行此操作。这是我们在目标忙于处理请求时所期望的。它将传递给另一个目标。现在让我们参考下面的代码:staticvoidMain(string[]args){BufferBlockbb=newBufferBlock();ActionBlocka1=newActionBlock((a)=>{Thread.Sleep(100);Console.WriteLine("ActionA1执行值{0}",a);});ActionBlocka2=newActionBlock((a)=>{Thread.Sleep(50);Console.WriteLine("ActionA2executingwithvalue{0}",a);});ActionBlocka3=newActionBlock((a)=>{Thread.Sleep(50);Console.WriteLine("ActionA3executingwithvalue{0}",a);});bb.LinkTo(a1);bb.LinkTo(a2);bb.LinkTo(a3);Taskt=newTask(()=>{inti=0;while(i执行时产生如下输出:这表明实际上只有一个目标是Alldataisbeingexecutedevenwhenitbusy(由于线程有意添加.Sleep(100))。为什么?这是因为所有目标块本质上都是贪婪的,即使它们无法处理数据也会缓冲输入。为了改变这种行为,我们在初始化ActionBlock时将DataFlowBlockOptions中的Greedy属性设置为false,如下所示.staticvoidMain(string[]args){BufferBlockbb=newBufferBlock();ActionBlocka1=newActionBlock((a)=>{Thread.Sleep(100);Console.WriteLine("ActionA1executingwithvalue{0}",a);},newDataflowBlockOptions(taskScheduler:TaskScheduler.Default,maxDegreeOfParallelism:1,maxMessagesPerTask:1,cancellationToken:CancellationToken.None,//NotGreedygreedy:false));ActionBlocka2=newActionBlock((a)=>{Thread.Sleep(50);Console.WriteLine("ActionA2executingwithvalue{0}",a);},newDataflowBlockOptions(taskScheduler:TaskScheduler.Default,maxDegreeOfParallelism:1、maxMessagesPerTask:-1,cancellationToken:CancellationToken.None,greedy:false));ActionBlocka3=newActionBlock((a)=>{Thread.Sleep(50);Console.WriteLine("ActionA3executingwithvalue{0}",a);},newDataflowBlockOptions(taskScheduler:TaskScheduler.Default,maxDegreeOfParallelism:1、maxMessagesPerTask:-1,cancellationToken:CancellationToken.None,贪心:false));bb.LinkTo(a1);bb.LinkTo(a2);bb.LinkTo(a3);Taskt=newTask(()=>{inti=0;while(itheprogramTheoutputis:Thisapparentlydistributingthedataamongthe3ActionBlocksasexpected不,第二个例子不会编译原因:greedy=false只能为“分组”数据流块设置-不能为执行块设置;然后必须通过GroupingDataflowBlockOptions设置-而不是DataflowBlockOptions;然后将其设置为属性值“{Greedy=false}”而不是构造函数参数。如果要限制操作块的容量,可以通过设置DataflowBlockOptionsImplementation的BoundedCapacity属性的值来实现(尽管如OP所述,他们已经知道此选项)。像这样:上面以上就是C#学习教程:BenefitsofUsingBufferBlockinDataflowNetworks的全部内容,如果对大家有用还需要了解更多关于C#学习教程,希望大家多多关注——vara1=newActionBlock(i=>doSomeWork(i),newExecutionDataflowBlockOptions{BoundedCapacity=1});被会员删除。如需转载请注明出处:
