#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, чтобы выполнить операцию отмены для потока. Обратите внимание, что ваше приложение должно проверить, была ли запрошена отмена. Используйте поток.Присоединиться, чтобы дождаться завершения потока.