Multithreading 为什么像ThreadAbortException这样的异常没有被捕获

Multithreading 为什么像ThreadAbortException这样的异常没有被捕获,multithreading,exception,Multithreading,Exception,(如果你感兴趣,这个问题的背景是,但我认为这对这个问题并不重要。) 我们试图在单独的线程中一次运行一系列报告导出(第三方方法调用),因此如果需要太长时间,我们可以终止线程。丑陋但迄今为止最好的想法是使用Thread.Abort终止导出给定报告的线程,然后执行ResetAbort以允许其余代码继续 概念验证代码如下所示: public RunningMethod() { Report myReport = new Report(); for (int i = 0; i <

(如果你感兴趣,这个问题的背景是,但我认为这对这个问题并不重要。)

我们试图在单独的线程中一次运行一系列报告导出(第三方方法调用),因此如果需要太长时间,我们可以终止线程。丑陋但迄今为止最好的想法是使用Thread.Abort终止导出给定报告的线程,然后执行ResetAbort以允许其余代码继续

概念验证代码如下所示:

public RunningMethod()
{
    Report myReport = new Report();

    for (int i = 0; i < 10; i++)
    {
        Thread reportThread = new Thread(() => DoBackgroundJob(myReport, "test" + i.ToString()));
        reportThread.Start();

        bool finished = reportThread.Join(TimeSpan.FromMilliseconds(100));
        if (!finished)
        {
            reportThread.Abort();
        }
    }
}

protected void DoBackgroundJob(Report myReport, string reportFilename)
{
    try
    {
        report.ExportToPdf(@"C:\" + reportFilename + ".pdf");
    }
    catch (ThreadAbortException)
    {
    }
    break;
}
公共运行方法()
{
报告myReport=新报告();
对于(int i=0;i<10;i++)
{
线程报告线程=新线程(()=>DoBackgroundJob(myReport,“test”+i.ToString());
reportThread.Start();
bool finished=reportThread.Join(TimeSpan.frommilluses(100));
如果(!完成)
{
reportThread.Abort();
}
}
}
受保护的无效DoBackgroundJob(报表myReport、字符串reportFilename)
{
尝试
{
ExportToPdf(@“C:\”+reportFilename+“.pdf”);
}
捕获(线程异常)
{
}
打破
}
当我运行这个时,我得到了一个奇怪的结果…导出行似乎抛出了一个异常,它似乎应该是ThreadAbortException,但显然不是,因为它没有被catch捕获(ThreadAbortException),而是被catch捕获(exception)

我想知道我得到了什么样的异常,但我看不到,因为当我试图查看它时,我只得到“无法计算表达式,因为代码已优化或本机框架位于调用堆栈顶部。”


有没有办法确定发生了什么?这里真正抛出了什么异常?

TAE是特殊的。要防止自动重试,需要Thread.ResetAbort()。请记住,您不能再调用安全调用ExtTopDFF(),而是考虑Enr.FultFAST()。它实际上似乎并不影响代码的运行方式(在这个简单的示例中)。我不明白为什么不能再次专门调用ExportToPdf()。如果报告处于错误状态(因为某些内容已损坏),那么除了ExportToPdf之外,几乎所有内容都可能是错误的吗?(也许这就是你的意思)。如果发生中止,我可能应该在循环中重新生成报告。