【问题标题】:Thread abort exception in C# using threads with delegatesC# 中使用带委托的线程的线程中止异常
【发布时间】:2020-08-18 23:28:06
【问题描述】:

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

对于上面的代码,我遇到了线程中止异常,任何人都可以帮我解决这个问题。

【问题讨论】:

  • 帮帮我...为什么你要调用thread.abort?这是一种非常致命的方法...您有什么具体的正在尝试做的吗? (“什么”而不是“如何”)
  • Thread.Abort() 按设计抛出该异常,除了用 try-catch 块隐藏它之外别无他法
  • 我正在尝试从线程中连续读取重量并在文本框中显示重量。当重量校准结束时,我正在尝试关闭它。

标签: c# delegates threadabortexception


【解决方案1】:

改变

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

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

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

【讨论】:

  • 但是当我再次尝试从中读取重量时。在按下读取按钮时,我收到“打开 com1 时出错:ioexception”
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 感谢您的宝贵建议。现在它正在工作
【解决方案3】:

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

参见docs“在调用它的线程中引发 ThreadAbortException”

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 2011-05-27
      • 2012-07-13
      • 2014-03-19
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多