У меня есть сценарий, в котором мне придется преобразовать большое количество объектов и назначить их некоторым родительским объектам-контейнерам.Правильное использование 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();
Это надуманный пример, в реальном коде выполняется фактическая работа по преобразованию объектов и помещению их под нужную запись в словаре. – Xerxes
@ Xerxes Я так и предполагал. Итак, если вы хотите, чтобы преобразование было параллельным, вы не можете использовать словарь без блокировки. Однако вы можете использовать 'ConcurrentDictionary'. – i3arnon
который вы бы предпочли? связать actionBlock и собрать все преобразованные объекты, а затем поместить их в словарь или использовать ConcurrentDictionary? – Xerxes