Одно падение ямы - вы теряете возможность использовать заказы в наборах.
Возьмем следующий код:
var results = new int { 0 ,1 ,2 ,3 };
var doSomethingSpecial = (from r in results.AsParallel() select r/2).ToArray();
Вы не можете рассчитывать на результаты приходят в порядке, в результате может быть любые перестановки множества. Это одна из самых больших ошибок, в том смысле, что если вы имеете дело с упорядоченными данными, вы можете потерять преимущества производительности из-за стоимости сортировки.
Другая проблема заключается в том, что вы теряете способность обнаруживать известные исключения. Таким образом, я не мог поймать исключение нулевого указателя (не говоря, что вы должны это делать) или даже поймать исключение FormatException.
Существует множество причин, почему вы не всегда должны использовать Plinq во всех случаях, и я выделил еще один. Не читайте также «автоматическое использование не параллельного Linq», он может обрабатывать только барьерные случаи, когда запрос является простым, или будет слишком сложным для параллельной работы.
Всегда помните, что чем больше польза PLINQ, тем больше ресурсов вы будете потреблять на сервере, которые убираются из других работающих потоков.
Ресурсы:
MSDN PLNQ white paper
Paul Kimmel on PLINQ
Для гарантированного заказа вы можете просто AsOrdered(), хотя вы, очевидно, нужно измерить, чтобы узнать, если вы получаете что-нибудь в вашем алгоритме, так как это делает добавить накладные расходы. Что касается исключений, вы получите исключение AggregateException, если что-то происходит в параллельном исполнении, из которого вы можете получить отдельные исключения, которые произошли с помощью свойства InnerException * s *. Как и в случае с любой технологией, единственный способ узнать, принесет ли она вам пользу, - это на самом деле измерить, используя наборы данных, представляющие то, что вы будете обрабатывать в реальном мире. –