Подтвердить что ты не робот

Thread.Abort vs Thread.Interrupt

Если мне нужно отменить некоторую операцию в потоке, когда следует использовать Thread.Abort vs Thread.Interrupt. Я прочитал документацию по нему, но не знаю, какой scneario должен использовать конкретный вызов между двумя.

Если есть какой-то третий способ сделать это, пожалуйста, позвольте мне заговорить об этом тоже с про и минусами.

4b9b3361

Ответ 1

Я бы избегал использовать Thread.Abort любой ценой. Его поведение намного безопаснее и предсказуемо с .NET 2.0, но с ним все еще есть довольно серьезные проблемы. Большинство прерываний внутри управляемого кода можно сделать безопасным, но не все из них. Например, я считаю, что есть некоторые тонкие проблемы, если запрос прерывания запускается во время обработки статического конструктора. Nevermind, тот факт, что внеполосное исключение может возникать в любое время, что дает вам небольшой контроль над определением, где находятся безопасные точки для выключения.

Существует несколько приемлемых способов прерывания потока изящно.

  • Используйте Thread.Interrupt
  • Опросить флаг остановки
  • Использовать события WaitHandle
  • Специализированные вызовы API

Я обсуждаю эти методы в своем ответе здесь.

Ответ 2

Большинство предложений уже сделано, но вот пример, как я бы это сделал:

    ManualResetEvent _requestTermination = new ManualResetEvent(false);
    Thread _thread;

    public void Init()
    {
        _thread = new Thread(() =>
         {

             while (!_requestTermination.WaitOne(0))
             {
                 // do something usefull

             }

         }));

        _thread.Start();
    }

    public void Dispose()
    {
        _requestTermination.Set();

        // you could enter a maximum wait time in the Join(...)
        _thread.Join();
    }

Таким образом, утилита будет ожидать выхода из потока.


Если вам нужна задержка внутри потока, вы не должны добавлять Thread.Sleep. Используйте WaitOne (delayTime). Таким образом, вам никогда не придется ждать, чтобы прекратить его.

Ответ 3

Я бы никогда не использовал Thread.Abort. Это вызывает исключение почти в произвольное время.

Ответ 4

Будьте осторожны с Thread.Interrupt. Если вы не создадите какое-то время ожидания или сна, нить не будет прервана.

Будьте осторожны с Thread.Abort. Если вы поймаете ThreadAbortException, ваш поток завершится сразу после catch + finally.

(Мне нравится использовать эти методы для отправки сигнала в мой поток, чтобы он знал, что он заканчивает время, а затем очистку и выход.)