У меня простой цикл С# foreach, как я могу вырваться из цикла при нажатии кнопки? Это не в фоновом режиме, поэтому я не могу использовать backgroundWorker.CancellationPending.
Создайте в форме булевский флаг. Прикрепите обработчик события к событию щелчка кнопок и установите флаг в true в обработчике событий.
Проверьте флаг в цикле, и если это правда, вызовите "break". (Лучшим вариантом было бы использовать цикл while вместо цикла for с проверкой флага в состоянии while)
Очевидно, цикл for должен быть в какой-то форме фонового потока, иначе GUI не будет реагировать. Если вы не знаете, как это сделать, проверьте ThreadPool.QueueUserWorkItem или BackgroundWorker. Если вы используете BackgroundWorker, вы можете использовать встроенный метод CancelAsync() вместо того, чтобы кодировать свой собственный флаг отмены.
[Edit: Как указано другими (ниже) и более подробно обсуждены здесь и здесь; вам нужно либо заблокировать до доступа к bool, либо пометить его как volatile]
[Не забудьте установить правильное состояние флага перед запуском цикла.]
Вот не очень хорошее решение.
Вызовите Application.DoEvents()
на каждой итерации свой цикл. В Button-Click установите переменную в True и в цикле проверьте эту переменную. Если это так, продолжайте разрыв в противном случае.
Как я уже сказал, это не очень хорошее решение. Application.DoEvents()
может быть очень опасным. Лучший вариант здесь - создать фоновый поток.
Вы можете использовать DoEvents, как предложил Аамир, в качестве быстрого исправления.
Для более масштабируемого и поддерживаемого решения вам нужно переместить работу в отдельный поток. Тогда довольно тривиально, чтобы событие нажатия кнопки установило флаг, чтобы остановить цикл. С другой стороны, есть немного больше работы для передачи результата обратно в поток пользовательского интерфейса.