Лучший алгоритм обычно лучше худшего (но распараллеленного):
private static IEnumerable<int> Primes(int upTo) {
if (upTo <= 1)
yield break;
yield return 2; // Special case: the only even prime
List<int> primes = new List<int>() { };
for (int number = 3; number <= upTo; number += 2) {
int max = (int)(Math.Sqrt(number) + 0.5);
bool isPrime = true;
foreach (var div in primes)
if (div > max)
break;
else if (number % div == 0) {
isPrime = false;
break;
}
if (isPrime) {
primes.Add(number);
yield return number;
}
}
}
...
txt_result.Text = string.Join(", ", Primes(1000000));
И вы получите
2, 3, 5, 7, 11, 13, 17, 19, 23, ... 999959, 999961, 999979, 999983
за доли секунды