为什么没有捕获类似ThreadAbortException的异常

时间:2016-04-13 15:24:00

标签: multithreading exception

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

我们试图在不同的线程中一次运行一系列报告导出(第三方方法调用),因此如果花费的时间太长,我们可以终止该线程。这个丑陋但最好的想法是使用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;
}

当我运行这个时,我得到一个奇怪的结果......导出行似乎抛出一个异常,好像它应该是一个ThreadAbortException,但显然不是,因为它不会被catch捕获( ThreadAbortException),但是被catch(异常)捕获。

我想知道我得到了什么样的异常,但我看不到它,因为当我尝试查看它时,我只得到“无法评估表达式,因为代码已优化或本机框架是在调用堆栈之上。“

有没有办法确定发生了什么?这里真的被抛出了什么例外?

0 个答案:

没有答案