TPL Dataflow数据回收

时间:2014-12-08 11:56:46

标签: c# task-parallel-library tpl-dataflow recycle

我正在开发一个我想使用TPL Dataflow构建的音频处理工具。 数据流本身将包括在声音处理块之间传递的音频样本。这些样本的大小通常为几Kb(float[] / byte[],具有1k至4k元素。 因此,数据流是一个简单的管道,如下所示:

SourceBlock<byte[]> 
    -> TransformBlock<byte[], float[]> 
        -> TransformBlock<float[], float[]>
            -> ...

某些块可以纯粹“就地”工作,即通过改变输入数据,而其他块必须创建新样本。每个块的处理时间可能因输入数据而异。

我不想一直分配新的数组,而是依靠垃圾收集器来处理对象的回收。 我希望从块的并发执行中受益,因此不希望限制链顺序处理数据(在这种情况下,我不需要TPL)。 我不需要处理块来运行并发处理(在任何给定时间,每个块最多只有一个进程)。

在给定时间控制管道中样品数量并回收不再使用的样品/阵列的最佳方案是什么?

1 个答案:

答案 0 :(得分:1)

如果您的目标是重复使用数组而不是始终创建新数组并让GC收集它们,则需要使用ObjectPool

  

对象池模式是一种软件创建设计模式,它使用一组准备好使用的初始化对象 - 一个&#34;池&#34; - 而不是按需分配和销毁它们。池的客户端将从池中请求对象并对返回的对象执行操作。当客户端完成后,它将对象返回池而不是销毁它;这可以手动或自动完成。

不幸的是,您可能需要自己实现它并使其成为线程安全的。