C # вырваться из цикла при нажатии кнопки - PullRequest
2 голосов
/ 03 августа 2009

У меня есть простой цикл Cach foreach, как я могу выйти из цикла при нажатии кнопки? Он не находится в потоке backgroundWorker, поэтому я не могу использовать backgroundWorker.CancellationPending.

Ответы [ 3 ]

5 голосов
/ 03 августа 2009

Создайте логический флаг в форме. Присоедините обработчик событий к событию нажатия кнопок и установите для этого флага значение true в обработчике событий.

Проверьте наличие флага в цикле и, если оно истинно, вызовите "break". (Лучше было бы использовать цикл while вместо цикла for с проверкой флага в условии while)

Очевидно, что цикл for должен быть в какой-то форме фонового потока, иначе графический интерфейс не будет отзывчивым. Если вы не знаете, как это сделать, проверьте ThreadPool.QueueUserWorkItem или BackgroundWorker . Если вы используете BackgroundWorker, вы можете использовать встроенный метод CancelAsync () вместо кодирования собственного флага отмены.

[Редактировать: Как указано другими (ниже) и обсуждено более подробно здесь и здесь ; вам нужно либо заблокировать доступ к bool, либо пометить его как изменчивый]

[Не забудьте установить правильное состояние флага, прежде чем начинать цикл.]

4 голосов
/ 03 августа 2009

Вот не очень хорошее решение.

Вызывайте Application.DoEvents() в каждой итерации вашего цикла. При нажатии кнопки установите переменную в True и в цикле проверьте эту переменную. Если это правда, в противном случае продолжить.

Как я уже сказал, это не очень хорошее решение. Application.DoEvents() может быть очень опасным. Наилучший вариант здесь - иметь фоновый поток.

0 голосов
/ 03 августа 2009

Вы можете использовать DoEvents, как предложил Аамир, для быстрого исправления.

Для более масштабируемого и обслуживаемого решения вам нужно перенести работу в отдельный поток. Тогда довольно просто иметь событие нажатия кнопки, чтобы установить флаг, чтобы остановить цикл. С другой стороны, есть еще немного работы, чтобы передать результат обратно в поток пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...