This is a sample. While looping the DoWork event, check CancellationPending to finish processing.
using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
AcceptButton = btnOK;
CancelButton = btnCancel;
SetupButton(true);
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void SetupButton(bool value) {
btnOK.Enabled = value;
btnCancel.Enabled = !value;
}
private void btnOK_Click(object sender, EventArgs e) {
SetupButton(false);
backgroundWorker1.RunWorkerAsync();
}
private void btnCancel_Click(object sender, EventArgs e) {
backgroundWorker1.CancelAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
for (int i = 0; i < 1000; i++) {
if (backgroundWorker1.CancellationPending) {
e.Cancel = true;
break;
}
Thread.Sleep(10);
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if (e.Cancelled) {
MessageBox.Show("Cancelled");
} else {
MessageBox.Show("Complete");
}
SetupButton(true);
}
}