Исключение прерывания потока в C # с использованием потоков с делегатами

#c# #delegates #threadabortexception

#c# #делегаты #threadabortexception

Вопрос:

Я использую поток для вызова функции, содержащей цикл while, для считывания весов. В цикле while я вызываю функцию делегирования для обновления значений в текстовом поле.

При нажатии кнопки с именем Stop я пытаюсь прервать поток, но получаю исключение прерывания потока:

  private System.Threading.Thread comm1;
 comm1 = new System.Threading.Thread(new System.Threading.ThreadStart(reading));
 comm1.Start();

 public void reading()
 {
   while(continus)
   {
     textBox1.Invoke(
                     new PrintValueTextDelegate(PrintValueText), 
                     new object[] { text Box, value.ToString() });

     for (int i = 0; i < risposta.Length; i  )
     {
        risposta[i] = 0;
     }

     if (_protocollo.Manda_TLC1(2, 0x70, risposta) == true)
     {
        if ((risposta[0] amp; 0x80) != 0x80)
        {
           cella = risposta[1] * 256   risposta[2];
           string rt = cella.ToString();
        }
      }
   }
 }

 private void btnstop_Click(object sender, EventArgs e)
 {
   try
   {
      continus = false;             
      System.Threading.Thread.Sleep(1000);               
      comm1.abort(); // wait for close foreground thread 
   }
   catch (Exception rt)
   {
       MessageBox.Show(rt.ToString());
   }          
 }
  

Для приведенного выше кода я получаю исключение прерывания потока, может ли кто-нибудь, пожалуйста, помочь мне с этой проблемой.

Комментарии:

1. помоги мне выбраться… почему вы пытаетесь вызвать thread.abort? это довольно смертоносный метод … Есть ли что-то конкретное, что вы пытаетесь сделать здесь? («что», а не «как»)

2. Нитки. Abort() генерирует это исключение по замыслу, нет другого способа обойти это, кроме как скрыть его с помощью блока try-catch

3. я пытаюсь постоянно считывать вес из потока и отображать вес в текстовом поле. когда калибровка веса заканчивается , я пытаюсь закрыть его .

Ответ №1:

изменить

 comm1.abort();// wait for close foreground thread 
  

Для

 comm1.join();// wait for close foreground thread 
  

abort немедленно останавливает поток, в то время как join ожидает его завершения.

Комментарии:

1. но когда я снова пытаюсь определить вес исходя из этого . при нажатии кнопки чтения я получаю сообщение «Ошибка при открытии com1: ioexception»

Ответ №2:

Вы получаете исключение прерывания потока, потому что вы указываете потоку прерваться…

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx (который на данный момент у меня не работает, но я извлек текст из кэша Google) говорит:

Исключение, которое выдается при вызове метода прерывания.

Обратите внимание, что это не исключение, сообщающее вам, что ваш вызов Thread.Сбой функции Abort(), это исключение из потока, который вы прерываете, со словами «Ага! Я только что был прерван!».

Если вы хотите более изящно остановить вызов stop, измените continus переменную в цикле while на false. Затем цикл while прекратит выполнение, и ваш поток должен завершиться.

Комментарии:

1. спасибо, Крис, за ваше ценное предложение. теперь это работает

Ответ №3:

Вызов Thread.Abort() вызывает исключение прерывания потока, вот как это работает.

Смотрите документы «Вызывает исключение ThreadAbortException в потоке, в котором оно вызывается»

Ответ №4:

Используйте CancellationTokenSource, чтобы выполнить операцию отмены для потока. Обратите внимание, что ваше приложение должно проверить, была ли запрошена отмена. Используйте поток.Присоединиться, чтобы дождаться завершения потока.