正确使用TplDataFlow TransformBlock

时间:2016-01-29 21:44:25

标签: c# .net tpl-dataflow

我有一个场景,我必须转换大量对象并将它们分配给一些父容器对象。

我在这些项目上使用id来确定它们属于哪个父项,所以我决定创建一个Dictionary来按顺序组织每个父对象及其子项。

我的问题是关于TransformBlock的正确用法,我是否应该尝试查找子对象的父对象并将其分配给字典,就像我在下面的示例代码示例中所做的那样,或者转换块是否只需要转换对象以及查找和分配父对象的实际工作在链接到变换块的动作块中完成。

var dictionary = new Dictionary<int, List<Item>>
{
    {1,new List<Item>() },
    {2,new List<Item>() },
    {3,new List<Item>() },
    {4,new List<Item>() },
    {5,new List<Item>() },
    {6,new List<Item>() },
    {7,new List<Item>() },
    {8,new List<Item>() },
    {9,new List<Item>() },
    {10,new List<Item>() },
};   

var transformBlock = new TransformBlock<ItemToMap, Item>
    (
        (itemToMap) =>
        {
            var parent = dictionary[itemToMap.ParentId];
            var item = mapToItem(itemToMap);
            parent.Add(item);
            return item;
        }
    );

foreach (var itemToMap in AllItemsToMap)
{
    transformBlock.Post(itemToMap);
}

transformBlock.Complete();

1 个答案:

答案 0 :(得分:3)

当你正在使用它时,没有理由使用TransformBlock。请改用ActionBlock

关于是否将作品分成两个不同的块,我的答案是它取决于你的配置。例如,如果您需要不同级别的并行性,则可以将工作拆分为块。

但是在你的例子中,我根本没有看到使用块的理由。除了将项目插入字典外,没有其他工作要做。