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

Я использую поток для вызова функции, содержащей цикл 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] & 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());
   }          
 }

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

4 ответа

Решение

Менять

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

в

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

abort немедленно останавливает поток, тогда как join ждет его до конца.

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

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

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

Обратите внимание, что это не исключение, говорящее о том, что ваш вызов Thread.Abort() не удался, это исключение из потока, который вы прерываете, говоря: "Ах, я только что был прерван!".

Если вы хотите остановиться более изящно, сделайте так, чтобы ваш остановочный звонок изменил ваш continus переменная в вашем цикле while в false. Тогда цикл while перестанет работать, и ваш поток должен завершиться.

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

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

См. Документацию "Вызывает исключение ThreadAbortException в потоке, в котором он вызывается"

Другие вопросы по тегам