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

В CurrentThread.Abort или нет в CurrentThread.Abort

Я видел несколько примеров, которые имеют процедуру потока, которая выглядит следующим образом.

    private void ThreadProc()
    {
        while (serviceStarted)
        {
            // do some work

            Thread.Sleep(new TimeSpan(0, 0, 5));
        }

        Thread.CurrentThread.Abort();
    }

Действительно ли нужен Abort() в конце?

Существует ряд аргументов против вызова Abort()

  • Как только процедура выйдет - ожидается, что она уже очистится после себя.
  • Вызов Abort() выдает исключение, которое, как правило, более ресурсоемкое, чем просто выход из процедуры.

Я хотел бы прочитать объяснение, почему это или не является хорошей практикой.

4b9b3361

Ответ 1

Вызов Thread.Abort() вызывает повышение исключения, и если вы пишете код, который будет повторно использоваться (или часть базовой библиотеки), другим разработчикам трудно справиться с ThreadAbortExcpetion s.

В этой статье описывается "Рекомендации по надежности" .

Я всегда слышал, что вызов Thread.Join() - лучший способ сделать это, если вы можете дождаться завершения потока обработка.

Я не знаю, думает ли кто-то, что это хорошая практика. Это может привести к блокировкам (поскольку неуправляемые ресурсы неправильно очищены при выбросе исключения)

Здесь другая статья об этом и другие способы решения этой проблемы.

Ответ 2

Как только цикл завершится, поток завершится сам по себе. Нет необходимости прерывать поток.

CurrentThread.Abort не только лишний, но и действительно вредный, так как он поднимает ThreadAbortException. Если другой поток пытается Join() поток вашего цикла обслуживания, ему придется обрабатывать исключение без необходимости. Лучше всего просто удалить строку CurrentThread.Abort().

Ответ 3

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

Ответ 4

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

Ответ 5

Нить, естественно, будет автоматически завершаться, когда не будет выполняться дальнейшая работа: когда выполняемая логика завершается.

Thread.Abort() вызывает a ThreadAbortException для текущего потока с явной целью быстрого завершения всего выполнения в потоке. Это одно из специальных исключений .NET, которое является "неустойчивым": вы можете написать блок catch, но исключение будет продолжать выдаваться после завершения блока catch. Это гарантирует, что некорректная инструкция для прерывания потока может быть остановлена ​​последующим кодом пользователя.

Вызов Thread.Abort() обычно рассматривается как плохая практика, поскольку есть более изящные способы прекратить выполнение логики. Отмена лучше обрабатывается с помощью CancellationToken.