2016-01-29 4 views
1

У меня есть сценарий, в котором мне придется преобразовать большое количество объектов и назначить их некоторым родительским объектам-контейнерам.Правильное использование TplDataFlow TransformBlock

Я использую идентификатор для этих элементов, чтобы определить, к какому родителю они принадлежат, поэтому я решил, что создам словарь, чтобы организовать каждый родительский объект и его дочерние элементы.

Мой вопрос касается правильного использования 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(); 

ответ

3

Поскольку вы используете его прямо сейчас, нет причин использовать TransformBlock. Вместо этого используйте ActionBlock.

О том, следует ли разделить работу на два разных блока, я бы ответил, что это зависит от вашей конфигурации. Если вам нужны разные уровни параллелизма, например, вы можете разделить работу на блоки.

В вашем примере, однако, я не вижу причины использовать блок вообще. Нет никакой реальной работы, кроме вставки элементов в словарь.

+0

Это надуманный пример, в реальном коде выполняется фактическая работа по преобразованию объектов и помещению их под нужную запись в словаре. – Xerxes

+0

@ Xerxes Я так и предполагал. Итак, если вы хотите, чтобы преобразование было параллельным, вы не можете использовать словарь без блокировки. Однако вы можете использовать 'ConcurrentDictionary'. – i3arnon

+0

который вы бы предпочли? связать actionBlock и собрать все преобразованные объекты, а затем поместить их в словарь или использовать ConcurrentDictionary? – Xerxes

 Смежные вопросы

  • Нет связанных вопросов^_^