我正在尝试更好地理解并行处理的整个概念,并设置测试用例。在尝试了这些测试之后,我发现在Dataflow中使用异步方法调用ActionBlock
(或TransformBlock
)并不会对性能产生积极影响,反而会使代码更加复杂。我的理解是,如果我正在使用Dataflow块,则其中的代码不必是异步的,Dataflow将自行使其异步化。或者我是错过了什么重要的点吗?
我正在尝试更好地理解并行处理的整个概念,并设置测试用例。在尝试了这些测试之后,我发现在Dataflow中使用异步方法调用ActionBlock
(或TransformBlock
)并不会对性能产生积极影响,反而会使代码更加复杂。我的理解是,如果我正在使用Dataflow块,则其中的代码不必是异步的,Dataflow将自行使其异步化。或者我是错过了什么重要的点吗?
ActionBlock
来并行处理它的处理),它是并发或并行代码用于通信数据的一种机制。除此之外,它还是一种消息传递机制 - 这在某种程度上是共享数据的替代方法。当多个线程使用共享数据时,需要昂贵的同步。当正确执行消息传递时,不需要同步,因为需要处理的数据封装在“发送”给将处理它的代码的消息中。TPL Dataflow 不适用于所有类型的并行处理,也不会让您的代码神奇地变快。
TDF 的主要思想是您有一些块,它们独立地完成各自的工作。这意味着每个块的工作可以在单独的线程上执行,因此在某些情况下使用 TDF 并行化您的代码可能非常简单。
如果块内部的代码使用了一些无法共享的资源,这种方法尤其有用。这样,您可以充分利用该共享资源,因为该块的处理与其他块无关。
总的来说,如果您的代码像一个管道:一个项目进入,经过第一阶段处理,然后经过第二阶段处理,最终到达输出,那么 TDF 最适合您。虽然数据流网络可能比这更复杂。但如果您想做的事情与 TDF 不太匹配,您就不应该强制使用它,否则只会使您的代码变得更加复杂而没有任何好处。
MaxDegreeOfParallelism
设置为无限制并不意味着每个项目都将在自己的线程上处理,那确实非常低效。它的意思是它将使用线程池允许的尽可能多的线程,这通常会是每个核心大约1个线程。 - svick