Вы можете просто использовать компонент BackgroundWorker .
Он основан на событиях и очень прост в использовании. Выглядит очень подходящим для того, что вы описываете.
Имеет хорошую поддержку сигналов отмены , а также отчетов о ходе выполнения .
И множество примеров кода вы можете найти в Google.
Установите свойство WorkerSupportsCancellation , чтобы оно было истинным.
backgroundworker1.WorkerSupportsCancellation = true;
Сделайте это перед тем, как запустить рабочего.
Затем в цикле вы можете опросить свойство CancellationPending :
if (backgroundWorker1.CancellationPending) return;
Просто пример, но вы должны понять.