Что делает resetAbort? - PullRequest
       27

Что делает resetAbort?

2 голосов
/ 11 мая 2011

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

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 ]

3 голосов
/ 11 мая 2011

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

1 голос
/ 11 мая 2011

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

0 голосов
/ 11 мая 2011

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

...