未处理的ThreadAbortException发生 - 有时

时间:2009-02-23 12:31:39

标签: c# multithreading exception exception-handling

我有一个对话框,必须处理大量数据(该过程非常耗时 - 首先ODBC填充需要时间,然后数据处理开始),结果是表单变得无法响应。这实际上不是问题,只需在新线程中打开“加载屏幕”即可通知用户该进程。

最近我发现,有时(似乎是随机的)新线程将抛出未处理的ThreadAbortException,导致崩溃报告对话框显示(或JIT)。

我不明白为什么会抛出这个异常,或者为什么它不会被处理。有没有人以前处理过这个问题,或者有人能指出我这种行为的可能原因吗?

谢谢!

编辑:如果重要,我打开加载屏幕:

//start of work load
Thread th = new Thread(new ThreadStart(MakeStep));    
th.Start();

...
//end of work or error occurance:
th.Abort();

//

3 个答案:

答案 0 :(得分:2)

您正在调用th.Abort(),在线程ThreadAbortException上注入th。如果该线程不处理该异常,则将其报告为未处理的异常。

通常不建议以这种方式中止其他线程,因为您不知道该线程是否会正常处理中止。更好的解决方案是在线程之间使用信令。

答案 1 :(得分:0)

调用Thread.Abort()时会引发ThreadAbortExceptions。看起来你或你正在使用的lib正试图杀死你的线程。

答案 2 :(得分:0)

如果你不知道它为什么会中止,那么最好放手而不是吞下例外。

话虽如此,您需要将您的MakeStep方法包装在try / catch中并记录异常(当然,还有任何一个例外)。像这样......

public void MakeStep()
{
  try
  {
    InnerMakeStep(); // may throw TAE or some other exception
  }catch(Exception e)
  {
    // log here k 
    throw; // in case it isn't a TAE
  }
}

记录异常后,可以调试该问题。现在,它可能是一千件事。