Причина в том, что параллель ForAll
не прекратит работу, когда найдет первое простое число, но будет всегда циклически проходить весь диапазон до возврата , тогда как ваша непараллельная версия вернет первое значение вправопрочь, когда его найдут.
Это также сделает ошибку параллельной версии, поскольку она не вернет первое найденное простое число в диапазоне, но на самом деле last найденное, поскольку оно перезаписывает nextPкаждый раз, когда новый диапазон находится в диапазоне.Обратите внимание, что это может быть не самое высокое простое число в диапазоне, только последнее найденное.Поскольку вы выполняете задачи, элементы могут обрабатываться не по порядку.
Вместо этого вы, вероятно, захотите использовать эту версию Parallel.ForEach , которая дает вам ParallelLoopState с каждой итерацией.Если вы вызовете Break () (примечание: не Stop () из-за неправильного исполнения ордера, то вы можете получить слишком большое значение) для этого объекта, цикл будет прерван при первой же возможности.Вам также нужно будет синхронизировать запись в nextP (это общее состояние для всех потоков), чтобы он сохранял только наименьшее значение, a'la;
lock(lockObject) {
if(value<nextP) nextP = value;
}
Что в целом должно позволить вамработать параллельно с большей производительностью.