BackroundWorker использует поток пула потоков, поэтому его следует использовать только для относительно (не более 1 секунды) единиц работы. Если ваша операция займет больше времени, вы должны создать поток.
Я, как и многие другие, я подозреваю, написал это для коммерческих проектов, но я не знаю ни одного решения с открытым исходным кодом. Я согласен, что вам нужно отобразить диалоговое окно с индикатором выполнения, хотя бы для того, чтобы пользователь дважды не нажал кнопку 1 и не вызвал повторный вход. Как вы говорите, вы также должны обрабатывать ошибки и отмены.