Что делает resetAbort?

Привет у меня есть следующий тестовый код:

class Program
{
    static void Main(string[] args)
    {
        Thread t = new Thread(Work);
        t.Start();
        Thread.Sleep(1000);
        t.Abort();
        Thread.Sleep(1000);
        t.Abort();
        Thread.Sleep(1000);
        t.Abort();
        t.Join();
        Console.WriteLine("End");
    }

    static void Work()
    {
        int i = 0;
        while (i<10)
        {
            try
            {
                while(true);
            }
            catch(ThreadAbortException)
            {
                Thread.ResetAbort();
            }

            Console.WriteLine("I will come back!");
            i++;
        }
    }
}

Каждый раз, когда происходит прерывание, Thread.ResetAbort() будет выполняться. Интересно, что делает этот ResetAbort. Потому что когда я его запустил, я увидел следующий вывод: я вернусь! Я вернусь! Я вернусь! И я не видел вывод "Конец" - кажется, что эта программа вообще не заканчивалась. Ты знаешь почему? Спасибо!

3 ответа

Решение

Отменяет запрос на прерывание потока. Как указано здесь. Таким образом, в этом случае цикл будет продолжен, и поток все еще должен быть живым.

Ответ остальных о ResetAbort верно. Причина, по которой "End" не выводится, заключается в том, что t.Join() никогда не вернется. Это потому, что ваш поток пытается прерваться только три раза, и ваш цикл содержит 10 попыток бесконечных циклов. Join возвращается, когда целевой поток завершает выполнение своего делегата, а ваш - нет.

ResetAborts отменяет запрос прерывания для потока

Другие вопросы по тегам