2014-11-20 2 views
0

Я получаю индекс из ошибки диапазона, если я запускаю ниже кодParaller Еогеасп в C#

var list=new list<PriceDetails>(); 
Parallel.ForEach(productResults.Items, productPrices => 
{ 
    var priceDetail=new PriceDetails { price=productPrices.prices.firstordefault();} 
    list.add(priceDetail); 
} 

Пожалуйста, приведите пример, который решает выше проблем с использованием одновременно?

+0

Это не имеет никакого смысла. Вы создаете список деталей цены, где цена всегда является первой ценой в списке. Может быть, вы можете описать, чего вы хотите достичь? – nvoigt

+0

образец кода я написал i.e получение цены от 1000 цен в цикле и придание цене детали объекта – mrl

+1

@nvoigt Он добавляет * первую цену за каждый товар * в список. Это цена от другого продукта каждый раз. – Servy

ответ

2

Проблема, с которой вы сталкиваетесь, - List.Add(, не поддерживает несколько потоков, используя ее в то же время. Лучшим решением является использование PLinq для создания List<PriceDetails> через его функции и ToList().

var list = productResults.Items 
       .AsParallel() 
       .Select(productPrices => new PriceDetails { price = productPrices.prices.firstordefault()}) 
       .ToList(); 

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

Тем не менее, я бы проверил это с и без AsParallel(). Параллель имеет накладные расходы, и создание нового класса обычно является дешевым ураном. Вы можете обнаружить, что ваш код работает быстрее без модификатора AsParallel().

+0

_Вы можете найти, что ваш код работает быстрее без модификатора AsParallel(). Я бы поставил несколько моментов на это - это хороший пример того, где __not__ использовать параллельный код. – TaW

+0

@TaW Я протестировал свой код с (для цикла) и без AsParallel для 1000 цен, а AsParallel - на 100 мс быстрее, чем обычно, для цикла и cource, это пренебрежимо – mrl

7

List<T> разработан в соответствии с предположением, что он никогда не доступен из нескольких потоков одновременно. небезопасно манипулировать им из нескольких потоков параллельно. Вам понадобится использовать структуру данных другого типа, которую делает, поддерживая это, например, что-то в System.Collections.Concurrent. Хорошо, это или вы могли бы просто не делать этого параллельно, чтобы начать. Я не вижу причин распараллеливать эту задачу в первую очередь.

+0

Вы имеете в виду параллельный список? есть ли какой-либо параллельный список в C#? – mrl

+0

Нет совпадающего списка. Как я уже сказал, вы, вероятно, не должны распараллеливать это вообще, просто делайте это последовательно, но если вы все равно хотите это сделать, вам нужно просмотреть доступные коллекции и посмотреть, что соответствует вашим потребностям. – Servy

+0

Возможно, вы захотите использовать [ConcurrentBag] (http://msdn.microsoft.com/en-us/library/dd381779 (v = vs.110) .aspx) для этого. Когда вы закончите заполнение, существует метод ToList, который может преобразовать его обратно в список, если это то, что вам нужно. – AWinkle

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