Вы не должны использовать Application.DoEvents (), чтобы поддерживать отзывчивость вашего приложения.
Вызов этого метода разрешит отправку любых сообщений ожидающих окон. Это означает, что если пользователь нажимает кнопку (или выполняет любое другое взаимодействие с пользователем), это действие будет обработано. Следовательно, это может привести к повторному входу. Если они нажмут ту же кнопку, что и та, которая вызвала цикл, который вы обрабатываете, вы в конечном итоге снова вызовете процедуру, прежде чем закончите!
Вместо этого вы должны использовать поток BackgroundWorker , чтобы выполнить длинный процесс, а затем, когда действие будет завершено, выполнить любые дополнительные действия. Например, после нажатия кнопки вы запускаете рабочий поток, а затем отключаете кнопку, чтобы ее нельзя было снова нажать. После завершения рабочего потока вы снова включите кнопку.