(选择,一对一)
与 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);