Track the Progress of a Background Worker Thread
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="WPF" Width="228" Height="168" > <StackPanel> <Button Click="StartStop_Click" Name="btnStartStop">Start</Button> <TextBlock Name="txtPercent"/> <TextBlock Name="txtBiggestPrime"/> </StackPanel> </Window> //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() + "%"; } } }