private void WorkerCompleted(object sender, FindPrimesCompletedEventArgs e)
        {
            // Stop tracking the worker.
            lock (workers)
            {
                workers.Remove((EratosthenesTask)sender);
            }

            // Show the results (on the user interface thread).
            this.Invoke(new FindPrimesCompletedEventHandler(ShowResults),
                new object[] {sender, e} );           
        }
 		private void ShowResults(object sender, FindPrimesCompletedEventArgs e)
        {
            AsyncTestResult result = new AsyncTestResult();
			result.Text = String.Format("Primes From {0} To {1}",
				new object[] { e.From, e.To });
            result.ShowList(e.PrimeList);
            result.MdiParent = this;
            result.Show();

            lock (workers)
            {
                statusPanel.Text = String.Format("Currently running {0} tasks.", workers.Count);
            }
        }