Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net TPL数据流与BlockingCollection_.net_Task Parallel Library_Data Synchronization_Tpl Dataflow - Fatal编程技术网

.net TPL数据流与BlockingCollection

.net TPL数据流与BlockingCollection,.net,task-parallel-library,data-synchronization,tpl-dataflow,.net,Task Parallel Library,Data Synchronization,Tpl Dataflow,我知道封锁收藏最适合消费者/生产者模式。但是,何时使用库中的ActionBlock 我最初的理解是IO操作,保留阻塞集合,而CPU密集型操作最适合操作块。但我觉得这不是全部。。。任何其他细节?TPL数据流更适合基于参与者的设计。这意味着,如果你想连锁生产商和消费者,使用TDF要容易得多 TPL数据流的另一个大优点是,它是在考虑async的情况下构建的。您既可以以同步方式生产和消费,也可以以异步方式生产和消费,这非常有用。 (我主要以同步方式生产,以非阻塞async方式消费) 您还可以非常轻松地设

我知道
封锁收藏
最适合消费者/生产者模式。但是,何时使用库中的
ActionBlock


我最初的理解是IO操作,保留
阻塞集合
,而CPU密集型操作最适合
操作块
。但我觉得这不是全部。。。任何其他细节?

TPL数据流更适合基于参与者的设计。这意味着,如果你想连锁生产商和消费者,使用TDF要容易得多

TPL数据流的另一个大优点是,它是在考虑
async
的情况下构建的。您既可以以同步方式生产和消费,也可以以
异步方式
生产和消费,这非常有用。 (我主要以同步方式生产,以非阻塞
async
方式消费)

您还可以非常轻松地设置有界容量和并行度


TL;DR:
BlockingCollection
是一个简单而通用的工具<代码>第三方物流数据流更加健壮,但对于特定的问题来说,可能是一种过激行为或不适合。

不确定重复使用字块是否会造成混淆。它们是非常不同的东西

你说得对,BlockingCollection非常适合生产者-消费者的情况,因为它将阻止尝试从中读取数据,直到数据可用为止。但是,BlockingCollection不是TPL数据流的一部分。它是在.NET4.0中作为新的线程安全集合类型之一引入的

然而,ActionBlock是由TPL数据流定义的“块”类型,可用于执行操作。从这个意义上讲,块更多的是指它作为数据流的一部分使用

TPL数据流中定义的数据流由块组成,主要有三种类型。从文件中:

TPL数据流库由数据流块组成,数据流块是缓冲和处理数据的数据结构。TPL定义了三种数据流块:源块、目标块和传播程序块。源块用作数据源,可以从中读取。目标块充当数据接收器,可以写入。传播程序块同时充当源块和目标块,可以从中读取和写入。TPL定义System.Threading.Tasks.Dataflow.ISourceBlock接口来表示源,定义System.Threading.Tasks.Dataflow.ITargetBlock来表示目标,定义System.Threading.Tasks.Dataflow.IPropagatorBlock来表示传播器。IPropagatorBlock继承自ISourceBlock和TargetBlock。 TPL数据流库提供了几种预定义的数据流块类型,用于实现ISourceBlock、ITargetBlock和IPropagatorBlock接口。这些数据流块类型在本文档的“预定义数据流块类型”一节中进行了描述

ActionBlock是ITargetBlock的一种类型,它接受输入,执行操作,然后停止

为了回答您的第一个问题,我认为您可以在流程简单时使用BlockingCollection。当您的流程更复杂时,您将使用TPL数据流,在这种情况下,您可能不需要BlockingCollection

这里有使用BlockingCollection的生产者-消费者问题示例: 在这里:

它们都不使用数据流。这里有一个使用数据流的示例:

另外,我强烈建议您在此处阅读TPL数据流文档:


如果您正在实现任何复杂的功能。

BlockingCollection对I/O来说并不好——事实上,由于不支持异步,情况更糟。@i3amon您能给出指导或示例吗?第三方物流(TPL)数据流怎么可能是过度的和不合适的?即使在简单的情况下,健壮性也不会有什么坏处。是否存在性能问题?谢谢。@silvalli TPL数据流让您以某种方式操作,BlockingCollection是开放的,您可以随意使用。BlockingCollection的问题在于它只是同步的。但是现在你有
System.Threading.Channels
库来避免这种情况。所以,这取决于您想要的是结构化并发还是非结构化并发。@silvalli我现在几乎在所有情况下都会避免阻塞集合。