Как ускорить заполнение списка с помощью 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 секунд, то у вас определенно есть другие проблемы, такие как потребление памяти.