public void Run(NumberReader reader) { var results = new List<long>(); var numbersToCheck = new BoundedBuffer<long>(bufferSize); StartComputationThreads(results, numbersToCheck); var progressMonitor = new ProgressMonitor(results,resultMutex); new Thread(progressMonitor.Run) {IsBackground = true}.Start(); foreach (var value in reader.ReadIntegers()) { numbersToCheck.Produce (value); } while (numbersToCheck.Count() > 0) { Thread.Sleep(100); // wait for the computation to complete. } Console.WriteLine("{0} of the numbers were prime", progressMonitor.TotalCount); }