You can just use the BackgroundWorker component.
It's event-based and is very easy to utilize. Looks very appropriate for what you are describing.
It has nice support for cancellation signaling as well as progress reporting too.
And a lot of code examples you can lookup on google.
Set the WorkerSupportsCancellation property so it is true.
backgroundworker1.WorkerSupportsCancellation = true;
Do it before you start the worker.
Then, in the loop, you can poll the CancellationPending property:
if (backgroundWorker1.CancellationPending) return;
Just an example, but you should get the idea.