(如果你感兴趣的话,这个问题的背景是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(异常)捕获。
我想知道我得到了什么样的异常,但我看不到它,因为当我尝试查看它时,我只得到“无法评估表达式,因为代码已优化或本机框架是在调用堆栈之上。“
有没有办法确定发生了什么?这里真的被抛出了什么例外?