You need to solve the basic problem of all apps that perform long running cpu intensive operations - that is, how to keep the UI responsive.

The quick and dirty, tightly coupled difficult to maintain way is to put the long running code into the UI and pepper the code with Application.DoEvent calls. (as you can tell, there isn't any bias in my previous response).

The proper way to do it where the user can start, stop, pause and resume the long running operation is to put the long running code into a worker thread (like BackgroundWorker) and update the ui with InvokeRequired.

All you're updating, cursor, buttons failing to disable, etc issues are due to the fact that the long running operation doesn't allow the main UI thread to pump messages which prevents the operations from running that allow the cursor to change, the button to disable, or the form to repaint. These are classic symptoms when long running operations are put into the UI thread.

Moving the long running operations into a worker thread requires more work to learn and implement, but once you learn how, it gets pretty easy. It also results in loosely coupled code that is easier to maintain. The code typically ends up being easier to unit test because the code performing the actual work isn't jammed in with the UI code.