数据流基础——创建自定义块
问题
假设你想把可复用的逻辑放到自定义的数据流块中。这样一来,便可以创建更大的块,使其包含更复杂的逻辑
解决方案
在数据流网格中,任意包含单个输入块和单个输出块的部分,都可以通过Encapsulate方法切出来。Encapsulate会在两个端点间创建单独的块,两个端点间的数据传播以及完成状态都由你来负责
IProgagatorBlock<int,int> CreateMyCustomBlock()
{
var multiplyBlock=new TransformBlock<int,int>(item=>item*2);
var addBlock=new TransformBlock<int,int>(item=>item+2);
var divideBlock=new TransformBlock<int,int>(item=>item/2);
var flowCompletion=new DataflowLinkOptions{PropagateCompletion=true};
multiplyBolk.LinkTo(addBlock,flowCompletion);
addBlock.LinkTo(divideBlock,flowCompletion);
return DataflowBlock.Encapsulate(multiplyBlock,divideBlock);
}
讨论
当把网格封装到自定义块中时,考虑需要将什么类型的选项暴露给用户,并且如何把(或者不把)没个块选项传递给内部网格,在许多情况下,某些块选项无法应用或者并不合理。因此,常见情况是,自定义块会设置自定义选项而不是接收DataflowBlockOptions参数。
DataflowBlock.Encapsulate只会以一个输入块和一个输出块封装网格。如果有包含多个输入或多个输出的可复用网格,那么应该把它封装到自定义多想中,然后把输入和输出分别作为ITargetBlock<T>和IReceivableSourceBlock<T>的属性暴露出来。