Завершение потока C# и поток. Аварийное прекращение работы ()

В MSDN, описании Потока. Аварийное прекращение работы () метод говорит: "Вызов этого метода обычно завершает поток".

Почему не ВСЕГДА?

В которых случаях это не завершает поток?

Там возможность состоит в том, чтобы завершить потоки?

82
задан knocte 30 March 2015 в 18:21
поделиться

8 ответов

Thread.Abort () вводит исключение ThreadAbortException в поток. Поток может отменить запрос, вызвав Thread.ResetAbort () . Кроме того, есть определенные части кода, такие как блок finally , которые будут выполняться до обработки исключения. Если по какой-то причине поток застрял в таком блоке, исключение никогда не будет вызвано в потоке.

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

57
ответ дан 24 November 2019 в 09:15
поделиться

Почему не ВСЕГДА? В каких случаях поток не завершается?

Для начала, поток может поймать ThreadAbortException и отменить собственное завершение. Или он может выполнить вычисление, которое займет вечность, пока вы пытаетесь его прервать. Из-за этого среда выполнения не может гарантировать, что поток всегда завершится после того, как вы его попросите.

ThreadAbortException содержит больше:

Когда вызывается метод Abort для уничтожения потока, среда CLR генерирует исключение ThreadAbortException. ThreadAbortException - это специальное исключение, которое может быть перехвачено, но оно будет автоматически снова вызвано в конце блока перехвата. Когда возникает это исключение, среда выполнения выполняет все блоки finally перед завершением потока. Поскольку поток может выполнять неограниченные вычисления в блоках finally или вызывать Thread.ResetAbort () для отмены прерывания, нет гарантии, что поток когда-либо завершится.

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

17
ответ дан 24 November 2019 в 09:15
поделиться

Что делать, если поток удерживает блокировку и прерывается / прекращается? Ресурсы остаются застрявшими

Он отлично работает, когда поток вызывает прерывание самого себя, но не другим потоком. Прерывание, принудительно завершает затронутый поток, даже если он еще не { {1}} выполнил свою задачу и не предоставляет возможности для очистки ресурсов

ссылка MSDN


см .: Лучшие практики управления потоками

5
ответ дан 24 November 2019 в 09:15
поделиться

ThreadAborts не будет происходить внутри блока finally или между BeginCriticalRegion и EndCriticalRegion

4
ответ дан 24 November 2019 в 09:15
поделиться

Это невозможно. Используйте функции рефакторинга Eclipse или заменяйте их по одному:

regex       : \bk_A
replacement : k_a 

regex       : \bk_B
replacement : k_b 

...

regex       : \bk_Z
replacement : k_z 
-121--1339816-

Дисплеи сегодня поддерживают 96 пикселей/дюйм или 72 пикселя/дюйм .

Вы можете получить заголовок HTTP запроса User-Agent

User-Agent: Mozilla/5.0 (Linux; X11)

этот сообщит вам операционную систему и отсюда вы можете принять решение.

-121--3926370-

OT: Полный, языковой агностический, сомнительно полезный и чертовски забавный прием параллелизма см. Verity Stob !

0
ответ дан 24 November 2019 в 09:15
поделиться

Потому что вы можете поймать ThreadAbortException и вызовите Thread.ResetAbort внутри обработчика.

3
ответ дан 24 November 2019 в 09:15
поделиться

Сначала можно использовать опцию -origin < имя > команды git clone

-origin < имя > , -o < имя >

Вместо использования удаленного имени origin для сохранения трека вышестоящего репозитория используйте < имя > .

Во-вторых, можно использовать git remote add для добавления репозитория для извлечения из существующего репозитория (чтобы можно было использовать git init , затем git remote add < имя > < url > ).


Если требуется создать зеркало репозитория с refs/heads/* , входящими в refs/heads/* в клоне, можно инициализировать репозиторий, настроить соответствующий refspec, а затем извлечь ...

Или можно использовать git clone --mirror , который должен отвечать на текущую версию вопроса ОП.

Однако это не приведет к сохранению конфигурации (включая удаленные), состояния рабочего дерева, переформатирования и т.д. Для этого потребуется скопировать хранилище целиком, как сказал Джесс Бауэрс .

-121--1573136-

С .NET 4. Проекты, которые можно использовать log4net. В проекте необходимо изменить целевую платформу на «.NET Framework 4».

Подробнее... http://krishnabhargav.blogspot.com/2010/02/using-net-35-clr-20-dll-inside-visual.html

-121--1340145-

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

-1
ответ дан 24 November 2019 в 09:15
поделиться

В каких случаях поток не прерывается?

Повторяющийся вопрос.

Что не так с использованием Thread.Abort ()

Есть ли другие возможности для завершения потоков?

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

См. Мой слишком длинный ответ на этот вопрос для более подробной информации:

Использование оператора блокировки в цикле в C #

Соответствующий бит - это бит в конце, где я обсуждаю, какие соображения касаются того, сколько времени вам следует подождите, пока поток не убьет себя, прежде чем прервать его.

52
ответ дан 24 November 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: