<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=System"
Title="WPF" Height="100" Width="200">
<Window.Resources>
<ComponentModel:BackgroundWorker
x:Key="backgroundWorker"
WorkerReportsProgress="True"
WorkerSupportsCancellation="True"
DoWork="BackgroundWorker_DoWork"
RunWorkerCompleted="BackgroundWorker_RunWorkerCompleted"
ProgressChanged="BackgroundWorker_ProgressChanged"/>
</Window.Resources>
<StackPanel>
<ProgressBar Name="progressBar"/>
<Button Name="button" Click="button_Click" HorizontalAlignment="Center">Start</Button>
</StackPanel>
</Window>
//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;
}
}
}