2011-11-04 76 views
1

我正在使用线程来调用包含while循环来读取权重的函数。在while循环中,我调用委托函数来更新文本框中的值。线程在C#中使用带代理的线程中止异常

在点击一个名为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()); 
    }   
} 

上面的代码我得到线程终止异常可以在任何一个请帮助我出了这个问题。

+2

帮我解决...... **为什么**你想要调用thread.abort?这是一种非常致命的方法......你有什么具体的*试图在这里做? (“什么”而不是“如何”) –

+0

Thread.Abort()通过设计引发异常,除了用try-catch块隐藏它外没有办法绕过它 – Alex

+0

我试图从连续读取体重线程并在文本框中显示重量。当重量校准结束时,我正在尝试关闭它。 –

回答

1

变化

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

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

abort立即停止线程,而join等待它完成。

+0

非常感谢你的帮助戴维肯普。这是工作 。 –

+0

但是当我尝试再次读取重量。在按下阅读按钮我得到“错误打开com1:ioexception” –

1

你得到一个线程终止异常,因为你是在告诉线程中止...

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx(whcih是不是为我工作的时刻,但我抓住了从谷歌的缓存文本)说:

调用Abort方法时引发的异常。

请注意,这并不是一个例外,表明您对Thread.Abort()的调用失败,它是您正在中止的线程发出的异常:“我刚被中止!”。

如果您想要更优雅地停下来,请在停止调用时将您的while循环中的continus变量更改为false。然后,while循环将停止运行,并且您的线程应该完成。

+0

谢谢你的克里你的宝贵建议。现在它正在工作 –

1

调用Thread.Abort()抛出一个线程中止异常,这是它的工作原理。

docs “引发的线程一个ThreadAbortException上调用它”

1

使用CancellationTokenSource对线程发出取消操作。请注意,您的申请必须检查是否已要求取消。 使用thread.Join等待一个线程退出。