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

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

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

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

        Thread.CurrentThread.Abort();
    }

Является ли Abort() действительно необходимым в конце?

There are number of arguments against calling Abort()

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

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

0

5 ответы

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

0
добавлено

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

Thread.Abort() causes a ThreadAbortException to be thrown on the current thread with the explicit purpose of rapidly terminating all execution on the thread. This is one of the special .NET exceptions which is "uncatchable": you can write a catch block but the exception will continue to be thrown after the catch block completes. This ensures there is no way an instruction to abort a thread can be stopped by subsequent user code.

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

0
добавлено

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

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

0
добавлено

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

В этой статье объясняется передовая практика надежности ,

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

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

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

0
добавлено

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

0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)