It depends, we can't see your code. First off, it is pretty unlikely that you can implement CancelAsync() so don't bother with that. Spinning until IsBusy returns false in the Dispose() method is an option, but do beware of deadlock. You'll definitely get one when you implemented an event handler for RunWorkerCompleted. It is unlikely you have one so spinning ought to be okay.
The sane approach is to just let it run. The user will be happy. Some precautions are necessary:
The worker thread should still be able to access the properties of the control even if it was disposed. This is not normally a problem, you store the values of simple backing variables, they don't become invalid when the control is disposed. Easy to test btw, but if you are not sure then using a simple class that stores the values that need to be preserved and passing it to RunWorkerAsync() is always safe.
You need to deal with the risk of the worker thread being aborted because the program terminated. If that happens just as it is writing the file then the file will get corrupted. You solve this by writing to another file instead. And using File.Replace() to swap it. In general always a strategy you should use when you replace files.