Support the Cancellation 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="230" Height="148" >
<StackPanel>
<Button Click="StartStop_Click" Name="btnStartStop" Height="34">Start</Button>
<TextBlock Name="txtBiggestPrime" Margin="5" />
</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 = 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;
}
}
}
}
Related examples in the same category