我正在使用一个线程调用包含while循环的函数来读取权重。在while循环中,我调用一个委托函数来更新文本框中的值。
单击名为Stop
的按钮时,我试图中止该线程,但我收到一个Thread Abort异常:
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());
}
}
对于上面的代码我得到线程中止异常可以任何人请帮我解决这个问题。
答案 0 :(得分:1)
您正在获取线程中止异常,因为您告诉线程中止...
http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx(暂时没有为我工作,但我从谷歌的缓存中抓取了文字)说:
调用Abort方法时抛出的异常。
请注意,这不是一个例外,告诉您对Thread.Abort()的调用失败,这是您正在中止的线程中的一个例外,说“Argh!我刚被中止!”。
如果您想要更优雅地停止,请拨打停止呼叫,将while循环中的continus
变量更改为false。然后while循环将停止运行,你的线程应该完成。
答案 1 :(得分:1)
调用Thread.Abort()
抛出一个线程中止异常,就是它的工作原理。
请参阅docs“在调用它的线程中引发ThreadAbortException”
答案 2 :(得分:1)
更改
comm1.abort();// wait for close foreground thread
到
comm1.join();// wait for close foreground thread
abort
立即停止线程,而join
等待它完成。
答案 3 :(得分:1)
使用CancellationTokenSource向线程发出取消操作。请注意,您的申请必须检查是否已请求取消。 使用thread.Join等待线程退出。