public static IEnumerable<int> GetPrimeNumbersParallel(int maxValue)
{
if (maxValue == 1) return Enumerable.Empty<int>();
if (maxValue == 2) return new[] { 2 };
Func<int, IEnumerable<int>> primeNumbers = max =>
from i in Enumerable.Range(2, max - 1).AsParallel()
where Enumerable.Range(2, (int)Math.Sqrt(i)).All(j => i % j != 0)
select i;
return primeNumbers(maxValue);
}