OriginalGriff
Хм. Здесь есть довольно много неправильных вещей.
Ваш поток включен в обработчик щелчков bytnDelete, и каждый раз, когда пользователь нажимает кнопку, вы создаете новый поток - поэтому, как только вы покидаете метод обработчика, вы не можете прервать его, потому что у вас нет доступа к самому потоку.
Установка значения Enabled в false означает, что вы не можете нажать кнопку (потому что система не позволит пользователю сделать это с отключенным элементом управления), поэтому, даже если бы вы могли получить доступ к существующему потоку в методе обработчика, вы не смогли бы заставить пользователя нажать кнопку.
Единственный поток, который может быть прерван в его нынешнем виде, - это тот, который вы только что создали и запустили, так что он не продвинется очень далеко, если вы вообще сможете его прервать!
Вы не можете получить доступ к элементам управления пользовательского интерфейса, кроме как из потока, который их создал-потока пользовательского интерфейса, - если вы попытаетесь, как вы делаете это здесь с DataGridView, вы получите исключения перекрестного потока. Прочитайте данные из DGV перед запуском потока и передайте коллекцию идентификаторов" подлежащего удалению " в поток для удаления.
Прерывание потока-опасная вещь, особенно когда он выполняет что-то сложное, например работу с базой данных, потому что вы не знаете, где находится поток в процессе. Не используйте прерывание, кроме как в реальных чрезвычайных ситуациях.
Не делайте такого доступа к БД! Никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.
Если вы хотите убить поток, то используйте переменную уровня класса, которая проверяется в конце каждого прохода через цикл - если это true
затем существует поток через возврат, в противном случае он снова вращается.
Member 12821006
- вы правы. но там, где я должен изменить код, чтобы остановить процесс DeleteThread. И то, что является лучшим способом, чтобы остановить поток?
OriginalGriff
Везде!
Этот код просто ошибочен - там нет ничего, что вы могли бы сохранить - даже окно сообщения, которое помешает пользователю добраться до кнопки "Отмена", чтобы закончить поток, если он этого захочет!