6

我从“Windows 上的并发编程”一书中得到以下代码:

void Main()
{
    try
    {
        try
        {
            Console.WriteLine("Inside Main Method");
            Thread.CurrentThread.Abort();
        }
        catch(ThreadAbortException)
        {
            Console.WriteLine("Inside First Catch");
            // Trying to swallow but CLR throws it again....
        }
    }
    catch(ThreadAbortException)
    {
        Console.WriteLine("Inside Second Catch");
        //Thread.ResetAbort();
    }
}

我很想知道为什么 CLR 会重新抛出 ThreadAbortException ?它一直这样做,直到我调用“Thread.ResetAbort()”。其次,是否有任何其他系统定义的异常,从 CLR 得到特殊处理?

4

2 回答 2

15

我很想知道为什么 CLR 会重新抛出 ThreadAbortException?

因为线程正在被中止。人们一直在处理所有异常,即使这样做很危险。如果一个错误记录例程让一个应该永远被销毁的线程保持活动状态,那将是很奇怪的,不是吗?

是否有任何其他系统定义的异常得到 CLR 的特殊处理?

是的,有几个。例如,栈外和内存外异常也有特殊的行为。

于 2011-11-23T06:41:42.983 回答
3

这是一个特殊的例外, http: //msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx,请参阅备注。据我了解,发生这种情况的原因是 .Net 使您能够在线程关闭之前进行任何清理工作。

有关管道的信息,请参见:http: //ondotnet.com/pub/a/dotnet/2003/02/18/threadabort.html

于 2011-11-23T06:09:18.720 回答