В MSDN описание метода Thread.Abort () гласит: «Вызов этого метода обычно завершает поток».
Почему не ВСЕГДА?
В каких случаях поток не прерывается?
Есть ли еще возможность завершить потоки?
c#
.net
multithreading
user101375
источник
источник
Это дублирующийся вопрос.
Что не так с использованием Thread.Abort ()
Да. Ваша проблема в том, что вы никогда не должны запускать поток, который вы не можете вежливо сказать, чтобы он остановился, и он останавливается своевременно. Если вы находитесь в ситуации, когда вам нужно запустить поток, который может быть (1) трудно остановить, (2) глючит или, что хуже всего, (3) враждебно настроен по отношению к пользователю, то правильным решением будет сделать новый процесс, запустите поток в новом процессе, а затем завершите процесс, когда вы хотите, чтобы поток остановился. Единственное, что может гарантировать безопасное завершение некооперативного потока, - это остановка всего процесса операционной системой.
Подробнее см. Мой слишком длинный ответ на этот вопрос:
Использование оператора блокировки в цикле в C #
Соответствующий бит - это бит в конце, где я обсуждаю, какие соображения касаются того, как долго вы должны ждать, пока поток не уничтожит себя, прежде чем вы его прервете.
источник
Во-первых, поток может поймать a
ThreadAbortException
и отменить собственное завершение. Или он может выполнить вычисление, которое займет вечность, пока вы пытаетесь его прервать. Из-за этого среда выполнения не может гарантировать, что поток всегда завершится после того, как вы его попросите.ThreadAbortException
имеет больше:Вам не нужно создавать
Abort()
поток вручную. CLR сделает за вас всю грязную работу, если вы просто позволите методу в потоке вернуться; это нормально завершит поток.источник
FileStream.Read()
к именованному каналу, который в настоящее время ничего не получает (читает блоки вызовов во время ожидания входящих данных), не отвечаетThread.Abort()
. Остается внутриRead()
звонка.источник
Что делать, если поток удерживает блокировку и прерывается / прекращается? Ресурсы остаются застрявшими
ссылка MSDN
см. Рекомендации по управлению потоками
источник
Кажется, я не могу прервать поток, который застрял в цикле:
//immortal Thread th1 = new Thread(() => { while (true) {}});
Однако я могу прервать поток, если во время цикла спит:
//mortal Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
источник
ThreadAborts не будет выполняться внутри блока finally или между BeginCriticalRegion и EndCriticalRegion
источник
Потому что вы можете поймать
ThreadAbortException
и вызватьThread.ResetAbort
внутри обработчика.источник
ОТ: Подробный, не зависящий от языка, сомнительно полезный и чертовски забавный взгляд на параллелизм см. В Verity Stob !
источник
У меня были случаи, когда поток был слишком занят, чтобы услышать вызов Abort (), что обычно приводит к тому, что мой код генерирует исключение ThreadAbortingException.
источник