Sounds like you could use some info on Asynchronous operations with thread safe cancellations.
Take a look here [
Thread Safe Operations]
Need to allow the cancelling of your other process by checking the cancelled flag.
OR: if you really want to use the background worker, you can have the button set a flag and during the event to report progress from the background worker check the flag and then safe cancel within that call.