C#转换块

例子

(选择,一对一)

与 ActionBlock 一样,TransformBlock<TInput, TOutput> 允许执行委托以对每个输入数据执行某些操作;与 ActionBlock 不同,此处理具有输出。  此委托可以是 Func<TInput, TOutput>,在这种情况下,当委托返回时,该元素的处理被视为已完成,或者它可以是 Func<TInput,Task>,在这种情况下,该元素的处理被视为未完成当委托返回但返回的任务完成时。对于熟悉 LINQ 的人来说,它有点类似于Select()它接受一个输入,以某种方式转换该输入,然后产生一个输出。

默认情况下, TransformBlock<TInput, TOutput> 以 MaxDegreeOfParallelism 等于 1 的方式顺序处理其数据。 除了接收缓冲输入并对其进行处理之外,该块还将获取其所有处理过的输出和缓冲(尚未处理的数据)已处理的数据)。

它有 2 个任务:一个是处理数据,一个是将数据推送到下一个区块。

并发管道

var compressor = new TransformBlock<byte[], byte[]>(input => Compress(input));
var encryptor = new TransformBlock<byte[], byte[]>(input => Encrypt(input));

compressor.LinkTo(Encryptor);

Stephen Toub 对 TPL 数据流的介绍