Keep the UI from becoming non-responsive in single threaded application which performs a long operation.

image_pdfimage_print


   
  

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Prime Numbers" Width="260" Height="75">
  <StackPanel Orientation="Horizontal" VerticalAlignment="Center" >
    <Button Content="Start" Click="StartOrStop" Name="startStopButton" Margin="5,0,5,0"/>
    <TextBlock Margin="10,5,0,0">Number:</TextBlock>
    <TextBlock Name="numberTextBlock" Margin="4,5,0,0">3</TextBlock>
  </StackPanel>
</Window>
//File:Window.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
using System.Threading;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public delegate void NextPrimeDelegate();
        private long num = 1;   

        private bool continueCalculating = false;

        public Window1() : base()
        {
            InitializeComponent();
        }
        public void StartOrStop(object sender, EventArgs e)
        {
            if (continueCalculating)
            {
                continueCalculating = false;
                startStopButton.Content = "Resume";
            }
            else
            {
                continueCalculating = true;
                startStopButton.Content = "Stop";
                startStopButton.Dispatcher.BeginInvoke(DispatcherPriority.Normal,new NextPrimeDelegate(CheckNextNumber));
            }
        }
        public void CheckNextNumber()
        {
            numberTextBlock.Text = num.ToString();
            num += 2;
            if (continueCalculating)
            {
                startStopButton.Dispatcher.BeginInvoke(
                    System.Windows.Threading.DispatcherPriority.SystemIdle, 
                    new NextPrimeDelegate(this.CheckNextNumber));
            }
        }
    }
}