Thread.Sleep
почти всегда неверный подход;когда вы обнаружите, что хотите использовать что-то подобное или Application.DoEvents
в своем коде, пришло время сделать длинный шаг назад и подумать о том, что вы действительно делаете и почему это не работает.Новый дизайн должен быть в вашем будущем.
Реальная проблема здесь в том, что вы выполняете работу над потоком пользовательского интерфейса, который блокирует взаимодействие пользователя с вашим приложением.Ваш щелчок на кнопке Button2 распознается и обрабатывается после того, как цикл уже завершил обработку, после чего он абсолютно ничего не делает.
Это происходит потому, что потоки могут выполнять только одну задачу за раз.И, на самом деле, Thread.Sleep(100)
только усугубляет это, потому что заставляет нить вращаться, а ничего не делает в течение 100 миллисекунд.Это еще 100 миллисекунд, которые потребуются для завершения цикла без какого-либо усиления.
Правильное решение этой (обычной) проблемы состоит в том, чтобы выделить цикл в отдельном потоке, используя что-то вроде BackgroundWorker
класс .Запись MSDN имеет очень хороший пример ее использования, включая ваш конкретный вариант использования: позволяет пользователю отменить длительную фоновую задачу.