Как ускорить заполнение списка с помощью TPL(библиотека параллельных задач) в C#

У меня есть следующий кусок кода

List<GridVM> _itemsSource = new List<GridVM>();

  foreach(var shelf in Network.Shelves)
   {
        foreach(var equipment in shelf.Equipment)
        {
          var gridVM= new GridVM(equipment);
          itemSource.Add(gridVM);
         }
   }

здесь _itemSource - это коллекция, которая будет источником данных для сетки.

Теперь создание каждого объекта VM для каждого оборудования занимает немного времени ~~ около 8 секунд. Я хочу ускорить заполнение источника данных сетки, используя TPL, запустив внутренний forloop в другом потоке и добавив vm в основную коллекцию _itemSource.

Как добиться этого, используя TPL. Будет ли это действительно ускорить мою работу, учитывая накладные расходы потока фактов и накладные расходы блокировки? Я могу преобразовать текущий источник элемента списка в ConcurrentList или ConcurrntBag. но тот же вопрос:- это действительно даст какой-либо импульс или нет. если нет, то мне интересно узнать почему??

1 ответ

Вы можете легко распараллелить ваш код, используя PLINQ (иначе Parallel Linq):

var _itemsSource = Network.Shelves
    .SelectMany(s => s.Equipment)
    .AsParallel()
    .Select(e => new GridVM(e))
    .ToList();

Это может выполняться быстрее, если конструктор требует времени. Если накладные расходы - это просто "добавление элементов в список", то вы ничего не получите. Тем не менее, если для добавления элементов в список требуется 8 секунд, то у вас определенно есть другие проблемы, такие как потребление памяти.

Другие вопросы по тегам