Тот факт, что вы используете Application.DoEvents
, является первым признаком проблемы: он показывает, что вы слишком много делаете в потоке пользовательского интерфейса. Это почти никогда не подходит в хорошо структурированной программе. Поток пользовательского интерфейса не предназначен для выполнения длительных задач. (Следует признать, что если рисование вашего пользовательского интерфейса занимает много времени, у вас мало выбора - но это предполагает, что вы должны упростить свой пользовательский интерфейс ... и я подозреваю, что это не применимо в этом случае.)
Вместо этого вы должны выполнять долгосрочную задачу (создание файлов) в отдельном потоке. BackgroundWorker идеально подходит для этого - вы можете использовать его, чтобы сообщить о прогрессе обратно в пользовательский интерфейс, и пользовательский интерфейс может вызвать CancelAsync
метод, чтобы запросить его остановку. Вам нужно проверить свойство CancellationPending
в рабочем потоке, чтобы узнать, была ли запрошена отмена, и правильно остановиться.
РЕДАКТИРОВАТЬ: Просто чтобы прояснить, что, по моему мнению, происходит - я подозреваю, что ваша форма закрывается, но программа не завершит работу, пока цикл событий не завершится. Вы продолжаете цикл событий вместе с циклом создания файла, поэтому проблема.
Обратите внимание, что для кнопки нет нити - есть только одна для всего вашего пользовательского интерфейса. (В некоторых случаях вам может понадобиться более одного потока пользовательского интерфейса, но это редко - и вы узнаете об этом, если сделаете это.)