TPL 数据流:将传入集合展平为顺序项
TPL Dataflow: Flatten incoming collection to sequential items
我正在使用 TPL 数据流构建应用程序。其实我有以下问题。我有一个变形方块 var tfb1 = new TranformBlock<InMsg, IReadOnlyCollection<OutMsg>>
。所以 tfb1
接收到消息并创建一个输出消息列表。此输出消息列表应链接到路由器数据块,该数据块接收 OutMsg
作为输入(而不是 IReadOnlyCollection<OutMsg>
)。
如何展平 IReadOnlyCollection
以便包含的消息可以用作输入,例如TransformBlock<OutMsg, SomeOtherType>
形式的变换块。可以通过 LinkTo()
吗?
感谢
您可以使用 TransformManyBlock
而不是 TransformMany
来展平任何 IEnumerable<T>
结果,例如:
var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
List<OutMsg> myResultList;
//Calculate some results
return myResultList;
});
这会将单个 OutMsg 实例传递到下一个块。
您可以使用迭代器,以便立即传播各个消息:
var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
//Calculate some results
foreach(var item in someDbResults)
{
yield return item;
}
});
或者您可以将输入展平:
var flattenBlock = new TransformManyBlock<IEnumerable<OutMsg>,OutMsg>(items=>items);
你可以link这个块到任何接受OutMsg的块:
var block = new ActionBlock<OutMsg>(...);
flattenBlock.LinkTo(block);
您可以通过将谓词传递给 LinkTo
来 路由 消息。例如,如果您想将失败消息路由到日志块,您可以键入:
flattenBlock.LinkTo(logBlock,msg=>msg.HasError);
flattenBlock.LinkTo(happyBlock);
不匹配任何谓词的消息将卡在输出缓冲区中并阻止块完成。通过让一个 link 不带谓词,您可以确保所有消息都将得到处理
我正在使用 TPL 数据流构建应用程序。其实我有以下问题。我有一个变形方块 var tfb1 = new TranformBlock<InMsg, IReadOnlyCollection<OutMsg>>
。所以 tfb1
接收到消息并创建一个输出消息列表。此输出消息列表应链接到路由器数据块,该数据块接收 OutMsg
作为输入(而不是 IReadOnlyCollection<OutMsg>
)。
如何展平 IReadOnlyCollection
以便包含的消息可以用作输入,例如TransformBlock<OutMsg, SomeOtherType>
形式的变换块。可以通过 LinkTo()
吗?
感谢
您可以使用 TransformManyBlock
而不是 TransformMany
来展平任何 IEnumerable<T>
结果,例如:
var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
List<OutMsg> myResultList;
//Calculate some results
return myResultList;
});
这会将单个 OutMsg 实例传递到下一个块。
您可以使用迭代器,以便立即传播各个消息:
var flattenBlock = new TransformManyBlock<InMsg,OutMsg>(msg=>{
//Calculate some results
foreach(var item in someDbResults)
{
yield return item;
}
});
或者您可以将输入展平:
var flattenBlock = new TransformManyBlock<IEnumerable<OutMsg>,OutMsg>(items=>items);
你可以link这个块到任何接受OutMsg的块:
var block = new ActionBlock<OutMsg>(...);
flattenBlock.LinkTo(block);
您可以通过将谓词传递给 LinkTo
来 路由 消息。例如,如果您想将失败消息路由到日志块,您可以键入:
flattenBlock.LinkTo(logBlock,msg=>msg.HasError);
flattenBlock.LinkTo(happyBlock);
不匹配任何谓词的消息将卡在输出缓冲区中并阻止块完成。通过让一个 link 不带谓词,您可以确保所有消息都将得到处理