Show a Continuous Progress Bar While Processing on a Background Thread







//File:Window.xaml.cs
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private BackgroundWorker worker = new BackgroundWorker();

public Window1()
{
InitializeComponent();
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}

private void button_Click(object sender, RoutedEventArgs e)
{
if (!worker.IsBusy)
{
this.Cursor = Cursors.Wait;
progressBar.IsIndeterminate = true;
button.Content = “Cancel”;
worker.RunWorkerAsync();
}
else
{
worker.CancelAsync();
}
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Cursor = Cursors.Arrow;

if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}

button.Content = “Start”;
progressBar.IsIndeterminate = false;
}

private void worker_DoWork(object sender, DoWorkEventArgs e){
for (int i = 1; i <= 100; i++) { if (worker.CancellationPending) break; Thread.Sleep(50); } } } } [/csharp]

A Cancellable ProgressBar While Processing on a Background Thread







//File:Window.xaml.cs
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private BackgroundWorker worker = new BackgroundWorker();

public Window1()
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.ProgressChanged += worker_ProgressChanged;
}

private void button_Click(object sender, RoutedEventArgs e){
if(!worker.IsBusy)
{
this.Cursor = Cursors.Wait;
worker.RunWorkerAsync();
button.Content = “Cancel”;
}else{
worker.CancelAsync();
}
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Cursor = Cursors.Arrow;
if(e.Cancelled)
{
MessageBox.Show(“Operation was canceled”);
}
else if(e.Error != null)
{
MessageBox.Show(e.Error.Message);
}

button.Content = “Start”;
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 1; i <= 100; i++) { if(worker.CancellationPending) { e.Cancel = true; return; } Thread.Sleep(100); worker.ReportProgress(i); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } } } [/csharp]

Use BackgroundWorker to run task at background






//File:Window.xaml.cs
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private BackgroundWorker worker = new BackgroundWorker();

public Window1()
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.ProgressChanged += worker_ProgressChanged;
}

private void button_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
this.Cursor = Cursors.Wait;
button.IsEnabled = false;
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Cursor = Cursors.Arrow;
if(e.Error != null)
MessageBox.Show(e.Error.Message);
button.IsEnabled = true;
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 1; i <= 100; i++) { Thread.Sleep(100); worker.ReportProgress(i); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } } } [/csharp]

Show a ProgressBar While Processing on a Background Thread






//File:Window.xaml.cs
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private BackgroundWorker worker = new BackgroundWorker();

public Window1()
{
InitializeComponent();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.ProgressChanged += worker_ProgressChanged;
}

private void button_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
this.Cursor = Cursors.Wait;
button.IsEnabled = false;
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Cursor = Cursors.Arrow;
if(e.Error != null)
MessageBox.Show(e.Error.Message);
button.IsEnabled = true;
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 1; i <= 100; i++) { Thread.Sleep(100); worker.ReportProgress(i); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } } } [/csharp]

Create a Background Worker Thread in XAML








//File:Window.xaml.cs

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private readonly BackgroundWorker worker;

public Window1()
{
InitializeComponent();
worker = this.FindResource(“backgroundWorker”) as BackgroundWorker;
}

private void button_Click(object sender, RoutedEventArgs e)
{
if(!worker.IsBusy)
{
this.Cursor = Cursors.Wait;
worker.RunWorkerAsync();
button.Content = “Cancel”;
}else{
worker.CancelAsync();
}
}

private void BackgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
for(int i = 1; i <= 100; i++) { if(worker.CancellationPending) break; Thread.Sleep(100); worker.ReportProgress(i); } } private void BackgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { this.Cursor = Cursors.Arrow; Console.WriteLine(e.Error.Message); button.Content = "Start"; } private void BackgroundWorker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; } } } [/csharp]

Support the Cancellation of a Background Worker Thread







//File:Window.xaml.cs

using System;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private BackgroundWorker worker = new BackgroundWorker();

private long from = 2;
private long to = 2000;
private long biggestPrime;

public Window1(): base()
{
InitializeComponent();
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
private void StartStop_Click(object sender, RoutedEventArgs e)
{
if(!worker.IsBusy)
{
worker.RunWorkerAsync();
btnStartStop.Content = “Cancel”;
txtBiggestPrime.Text = string.Empty;
}
else
{
worker.CancelAsync();
}
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if(e.Cancelled)
{
MessageBox.Show(“Operation was canceled”);
}

btnStartStop.Content = “Start”;
txtBiggestPrime.Text = biggestPrime.ToString();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for(long current = from; current <= to; current++) { if(worker.CancellationPending) { e.Cancel = true; return; } biggestPrime = current; } } } } [/csharp]

Track the Progress of a Background Worker Thread








//File:Window.xaml.cs
using System;
using System.ComponentModel;
using System.Windows;

namespace WpfApplication1
{
public partial class Window1 : Window
{
private BackgroundWorker worker = new BackgroundWorker();

private long from = 2;
private long to = 20000;
private long biggestPrime;

public Window1() : base()
{
InitializeComponent();
worker.WorkerReportsProgress = true;

worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.ProgressChanged += worker_ProgressChanged;
}

private void StartStop_Click(object sender, RoutedEventArgs e)
{
worker.RunWorkerAsync();
btnStartStop.IsEnabled = false;
txtBiggestPrime.Text = string.Empty;
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
btnStartStop.IsEnabled = true;
txtBiggestPrime.Text = biggestPrime.ToString();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
for(long current = from; current <= to; current++){ biggestPrime = current; int percentComplete = Convert.ToInt32(((double) current / to) * 100d); worker.ReportProgress(percentComplete); System.Threading.Thread.Sleep(10); } } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { txtPercent.Text = e.ProgressPercentage.ToString() + "%"; } } } [/csharp]