Mega Code Archive

 
Categories / C# / WPF
 

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

<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));             }         }     } }