Почему CLR повторно выбрасывает ThreadAbortException? - PullRequest
6 голосов
/ 23 ноября 2011

Я получил следующий код из книги «Параллельное программирование в 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?

Ответы [ 2 ]

15 голосов
/ 23 ноября 2011

Мне интересно знать, почему CLR повторно генерирует исключение ThreadAbortException?

Поскольку поток прерывается.Люди постоянно обрабатывают все исключения, хотя это опасно.Было бы странно, если бы подпрограмма регистрации ошибок, скажем, сохранила поток, который должен был быть уничтожен, живым навсегда, нет?

Есть ли какое-либо другое системное исключение, которое получает специальную обработку от CLR?

Да, их несколько.Например, исключения из стека и из памяти также имеют особые поведения.

3 голосов
/ 23 ноября 2011

Это специальное исключение, http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx, см. Примечания. Насколько я понимаю, причина этого состоит в том, что .Net дает вам возможность выполнить любую работу по очистке до закрытия потока.

Посмотрите немного о сантехнике: http://ondotnet.com/pub/a/dotnet/2003/02/18/threadabort.html

...