private void StartGrindingButton_OnClick(object sender, RoutedEventArgs e)
        {
            StartGrindingButton.IsEnabled = false;

            m_processingCts   = new CancellationTokenSource();
            m_processingToken = m_processingCts.Token;

            m_primes = new ConcurrentBag <int>();

            Task.Factory.StartNew(
                () =>
            {
                m_stopwatch    = Stopwatch.StartNew();
                m_managedCalls = 0;
                m_nativeCalls  = 0;
                Parallel.For(
                    0,
                    Int32.MaxValue,
                    new ParallelOptions {
                    CancellationToken = m_processingToken
                },
                    n =>
                {
                    if (ThreadSafeRandom.Next() % 2 == 0)
                    {
                        Interlocked.Increment(ref m_managedCalls);
                        if (ManagedProcessor.IsPrime(n))
                        {
                            m_primes.Add(n);
                        }
                    }
                    else
                    {
                        Interlocked.Increment(ref m_nativeCalls);
                        if (WrapperProcessor.IsPrime(n))
                        {
                            m_primes.Add(n);
                        }
                    }
                });
            }, m_processingToken);
            m_stopwatch.Stop();
        }