Исключение прерывания потока в C # с использованием потоков с делегатами - PullRequest
1 голос
/ 04 ноября 2011

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

1 голос
/ 04 ноября 2011

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

1 голос
/ 04 ноября 2011

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

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

1 голос
/ 04 ноября 2011

изменить

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

на

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

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

1 голос
/ 04 ноября 2011

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

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

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

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

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

...