Easy guide to learn Parallel ForEach in C#


SUBMITTED BY: emmek

DATE: Feb. 27, 2023, 11:47 p.m.

FORMAT: C#

SIZE: 2.7 kB

HITS: 1135

  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. namespace ParallelExample
  8. {
  9. class Program
  10. {
  11. static void Main()
  12. {
  13. // 2 million
  14. var limit = 2_000_000;
  15. var numbers = Enumerable.Range(0, limit).ToList();
  16. var watch = Stopwatch.StartNew();
  17. var primeNumbersFromForeach = GetPrimeList(numbers);
  18. watch.Stop();
  19. var watchForParallel = Stopwatch.StartNew();
  20. var primeNumbersFromParallelForeach = GetPrimeListWithParallel(numbers);
  21. watchForParallel.Stop();
  22. Console.WriteLine($"Classical foreach loop | Total prime numbers : {primeNumbersFromForeach.Count} | Time Taken : {watch.ElapsedMilliseconds} ms.");
  23. Console.WriteLine($"Parallel.ForEach loop | Total prime numbers : {primeNumbersFromParallelForeach.Count} | Time Taken : {watchForParallel.ElapsedMilliseconds} ms.");
  24. Console.WriteLine("Press any key to exit.");
  25. Console.ReadLine();
  26. }
  27. /// <summary>
  28. /// GetPrimeList returns Prime numbers by using sequential ForEach
  29. /// </summary>
  30. /// <param name="inputs"></param>
  31. /// <returns></returns>
  32. private static IList<int> GetPrimeList(IList<int> numbers) => numbers.Where(IsPrime).ToList();
  33. /// <summary>
  34. /// GetPrimeListWithParallel returns Prime numbers by using Parallel.ForEach
  35. /// </summary>
  36. /// <param name="numbers"></param>
  37. /// <returns></returns>
  38. private static IList<int> GetPrimeListWithParallel(IList<int> numbers)
  39. {
  40. var primeNumbers = new ConcurrentBag<int>();
  41. Parallel.ForEach(numbers, number =>
  42. {
  43. if (IsPrime(number))
  44. {
  45. primeNumbers.Add(number);
  46. }
  47. });
  48. return primeNumbers.ToList();
  49. }
  50. /// <summary>
  51. /// IsPrime returns true if number is Prime, else false.(https://en.wikipedia.org/wiki/Prime_number)
  52. /// </summary>
  53. /// <param name="number"></param>
  54. /// <returns></returns>
  55. private static bool IsPrime(int number)
  56. {
  57. if (number < 2)
  58. {
  59. return false;
  60. }
  61. for (var divisor = 2; divisor <= Math.Sqrt(number); divisor++)
  62. {
  63. if (number % divisor == 0)
  64. {
  65. return false;
  66. }
  67. }
  68. return true;
  69. }
  70. }
  71. }

comments powered by Disqus