2015-04-06 5 views
0

У меня есть запрос с AsParallel(). ForAll иногда пропускает некоторые записи и иногда возвращает нулевые записи в моем случае.Is AsParallel(). ForAll надежный

Я не уверен, что это является точной причиной этого. Является ли механизм для parellal для .Net надежным?

Edit: Пример кода

var collection=.. Collection from database 
var processedCollection=... 
collection.Where(h => h.Id == id).AsParallel().ForAll(h => 
{ 
    var processedCollectionItem = ....logic to process the item 
    processedCollectionItem.Where(c=>c.....).AsParallel().ForAll(c => 
    { 
     //logic to process the records 
    }); 
    processedCollection.Add(processedCollectionItem); 
}); 
+6

Я сильно подозреваю, что это ваше * использование *, которое виновато, а не BCL. Можете ли вы опубликовать краткую, но полную программу, демонстрирующую проблему? –

ответ

1

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

Пример:

var processedCollection = collection 
    .Where(h => h.Id == id) 
    .AsParallel() 
    .Select(h => ProcessItem(h)) 
    .ToArray(); 

В ProcessItem будет происходить обработка. Выполнение этого параллельно кажется ненужным.

1

Я думаю processedCollection это коллекция, которая не поточно (возможно, простой общий список?).

Простое решение заключается в использовании замок:

lock (processedCollection) // or better use a dedicated lock object 
{ 
    processedCollection.Add(processedCollectionItem); 
} 

или использовать безопасный сбор потоков как ConcurrentBag<>.

+0

Да, обработанный сбор является простым общим списком. –

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