2

我正在使用线程调用包含 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

4 回答 4

2

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

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx(目前对我不起作用,但我从谷歌的缓存中获取了文本)说:

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

请注意,这不是告诉您调用 Thread.Abort() 失败的异常,而是您正在中止的线程说“啊!我刚刚被中止!”的异常。

如果你想更优雅地停止,那么让你的 stop 调用将你continus的 while 循环中的变量更改为 false。然后while循环将停止运行,您的线程应该完成。

于 2011-11-04T11:34:44.343 回答
2

调用Thread.Abort()会引发线程中止异常,这就是它的工作方式。

请参阅文档“在调用它的线程中引发 ThreadAbortException”

于 2011-11-04T11:34:59.733 回答
2

改变

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

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

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

于 2011-11-04T12:50:25.420 回答
2

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

于 2011-11-04T13:01:25.510 回答