// 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.LatestPrimeNumber); } else { this.UpdateListViewItem( taskId, e.ProgressPercentage); } } else if (this.progressCounter > this.progressInterval) { this.progressCounter = 0; } }
// This method computes the list of prime numbers used by the // IsPrime method. private ArrayList BuildPrimeNumberList( int numberToTest, AsyncOperation asyncOp) { ProgressChangedEventArgs e = null; ArrayList primes = new ArrayList(); int firstDivisor; int n = 5; // Add the first prime numbers. primes.Add(2); primes.Add(3); // Do the work. while (n < numberToTest && !TaskCanceled(asyncOp.UserSuppliedState)) { if (IsPrime(primes, n, out firstDivisor)) { // Report to the client that a prime was found. e = new CalculatePrimeProgressChangedEventArgs( n, (int)((float)n / (float)numberToTest * 100), asyncOp.UserSuppliedState); asyncOp.Post(this.onProgressReportDelegate, e); primes.Add(n); // Yield the rest of this time slice. Thread.Sleep(0); } // Skip even numbers. n += 2; } return(primes); }
// This method computes the list of prime numbers used by the // IsPrime method. private ArrayList BuildPrimeNumberList( int numberToTest, AsyncOperation asyncOp) { ProgressChangedEventArgs e = null; ArrayList primes = new ArrayList(); int firstDivisor; int n = 5; // Add the first prime numbers. primes.Add(2); primes.Add(3); // Do the work. while (n < numberToTest && !TaskCanceled(asyncOp.UserSuppliedState)) { if (IsPrime(primes, n, out firstDivisor)) { // Report to the client that a prime was found. e = new CalculatePrimeProgressChangedEventArgs( n, (int)((float)n / (float)numberToTest * 100), asyncOp.UserSuppliedState); asyncOp.Post(this.onProgressReportDelegate, e); primes.Add(n); // Yield the rest of this time slice. Thread.Sleep(0); } // Skip even numbers. n += 2; } return primes; }