我有一个对话框,必须处理大量数据(该过程非常耗时 - 首先ODBC填充需要时间,然后数据处理开始),结果是表单变得无法响应。这实际上不是问题,只需在新线程中打开“加载屏幕”即可通知用户该进程。
最近我发现,有时(似乎是随机的)新线程将抛出未处理的ThreadAbortException,导致崩溃报告对话框显示(或JIT)。
我不明白为什么会抛出这个异常,或者为什么它不会被处理。有没有人以前处理过这个问题,或者有人能指出我这种行为的可能原因吗?
谢谢!
编辑:如果重要,我打开加载屏幕:
//start of work load
Thread th = new Thread(new ThreadStart(MakeStep));
th.Start();
...
//end of work or error occurance:
th.Abort();
//
答案 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
}
}
记录异常后,可以调试该问题。现在,它可能是一千件事。