private ArrayList BuildPrimeNumberList(int numberToTest, AsyncOperation asyncOp) { ProgressChangedEventArgs e = null; var primes = new ArrayList(); var firstDivisor = 1; var n = 5; primes.Add(2); primes.Add(3); while (n < numberToTest && !IsTaskCanceled(asyncOp.UserSuppliedState)) { if (IsPrime(primes, n, out firstDivisor)) { var progressPercentage = (int)((float)n / (float)numberToTest * 100); e = new CalculatePrimeProgressChangedEventArgs(n, progressPercentage, asyncOp.UserSuppliedState); asyncOp.Post(onProgressReportDelegate, e); primes.Add(n); // Yield the rest of this time slice. Thread.Sleep(0); } // Skip even numbers. n += 2; } return(primes); }
// This event handler updates the ListView control when the // PrimeNumberCalculator raises the ProgressChanged event. // // On fast computers, the PrimeNumberCalculator can raise many // successive ProgressChanged events, so the user interface // may be flooded with messages. To prevent the user interface // from hanging, progress is only reported at intervals. private void primeNumberCalculator1_ProgressChanged(ProgressChangedEventArgs e) { if ((this.progressCounter++ % this.progressInterval) == 0) { Guid taskId = (Guid)e.UserState; if (e is CalculatePrimeProgressChangedEventArgs) { CalculatePrimeProgressChangedEventArgs cppcea = e as CalculatePrimeProgressChangedEventArgs; this.UpdateListViewItem(taskId, cppcea.ProgressPercentage, cppcea.LatestPrimeNumberValue); } else { this.UpdateListViewItem(taskId, e.ProgressPercentage); } } else if (this.progressCounter > this.progressInterval) { this.progressCounter = 0; } }