Member 12821006 Ответов: 1

Когда я нажимаю на событие btnstop, deletethread должен остановить процесс. Кто-нибудь может помочь? Спасибо в adavance


когда я нажимаю на событие btnstop, оно не останавливает рабочий процесс DeleteThread.

Что я уже пробовал:

это еще одно событие btnDelete.
ivate void btnDelete_Click(object sender, EventArgs e)
        {
            Thread DeleteThread = new Thread(deleteThread);
                DeleteThread.Start();
            if(btnDelete.Enabled==false)
            {
                DeleteThread.Abort();
            }
        }

функция для deleteThread
blic void deleteThread()
        {
            foreach (DataGridViewRow item in dataGridView1.Rows)
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("delete from demo where id='" + item.Cells[0].Value.ToString() + "'", con);
                Thread.Sleep(1000);
                cmd.ExecuteNonQuery();
                MessageBox.Show("your selected " + item.Cells[0].Value.ToString() + " record is deleted");
                con.Close();
            }
        }

это событие btnstop
private void btnStop_Click(object sender, EventArgs e)
        {
            btnDelete.Enabled = false;
        }

1 Ответов

Рейтинг:
2

OriginalGriff

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

Если вы хотите убить поток, то используйте переменную уровня класса, которая проверяется в конце каждого прохода через цикл - если это true затем существует поток через возврат, в противном случае он снова вращается.


Member 12821006

- вы правы. но там, где я должен изменить код, чтобы остановить процесс DeleteThread. И то, что является лучшим способом, чтобы остановить поток?

OriginalGriff

Везде!
Этот код просто ошибочен - там нет ничего, что вы могли бы сохранить - даже окно сообщения, которое помешает пользователю добраться до кнопки "Отмена", чтобы закончить поток, если он этого захочет!