private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            PrimesInput input = (PrimesInput)e.Argument;

            int[] primes = Worker.FindPrimes(input, backgroundWorker);
            if (backgroundWorker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }
            e.Result = primes;
        }
        private void bSubmit_Click(object sender, RoutedEventArgs e)
        {
            bSubmit.IsEnabled = false;
            bCancel.IsEnabled = true;
            Result.Items.Clear();
            int from, to;

            try
            {
                from = Int32.Parse(From.Text.Trim());
                to   = Int32.Parse(To.Text.Trim());
            }
            catch (Exception ex)
            {
                MessageBox.Show("В полях для ввода некорректные значения");
                return;
            }
            PrimesInput input = new PrimesInput(from, to);

            backgroundWorker.RunWorkerAsync(input);
        }
        static public int[] FindPrimes(PrimesInput input, BackgroundWorker backgroundWorker)
        {
            int num = input.from;

            int[] arr       = new int[input.to - input.from];
            int   iteration = arr.Length / 100;

            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = num;
                num++;
            }
            int maxDiv = (int)Math.Floor(Math.Sqrt(input.to));

            int[] marks = new int[arr.Length];
            for (int i = 0; i < arr.Length; i++)
            {
                for (int j = 2; j <= maxDiv; j++)
                {
                    if ((arr[i] != j) && (arr[i] % j == 0))
                    {
                        marks[i] = 1;
                    }
                }
                if ((i % iteration == 0) && (backgroundWorker != null))
                {
                    if (backgroundWorker.CancellationPending)
                    {
                        return(null);
                    }
                    if (backgroundWorker.WorkerReportsProgress)
                    {
                        backgroundWorker.ReportProgress(i / iteration);
                    }
                }
            }
            int primes = 0;

            for (int i = 0; i < marks.Length; i++)
            {
                if (marks[i] == 0)
                {
                    primes++;
                }
            }
            int[] ret  = new int[primes];
            int   curs = 0;

            for (int i = 0; i < marks.Length; i++)
            {
                if (marks[i] == 0)
                {
                    ret[curs] = arr[i];
                    curs++;
                }
            }
            if (backgroundWorker != null && backgroundWorker.WorkerReportsProgress)
            {
                backgroundWorker.ReportProgress(100);
            }
            return(ret);
        }
 static public int[] FindPrimes(PrimesInput input)
 {
     return(FindPrimes(input, null));
 }