В MSDN, описании Потока. Аварийное прекращение работы () метод говорит: "Вызов этого метода обычно завершает поток".
Почему не ВСЕГДА?
В которых случаях это не завершает поток?
Там возможность состоит в том, чтобы завершить потоки?
Thread.Abort ()
вводит исключение ThreadAbortException
в поток. Поток может отменить запрос, вызвав Thread.ResetAbort ()
. Кроме того, есть определенные части кода, такие как блок finally
, которые будут выполняться до обработки исключения. Если по какой-то причине поток застрял в таком блоке, исключение никогда не будет вызвано в потоке.
Поскольку вызывающий имеет очень слабый контроль над состоянием потока при вызове Abort ()
, обычно это не рекомендуется делать. Вместо этого передайте сообщение потоку с запросом на завершение.
Почему не ВСЕГДА? В каких случаях поток не завершается?
Для начала, поток может поймать ThreadAbortException
и отменить собственное завершение. Или он может выполнить вычисление, которое займет вечность, пока вы пытаетесь его прервать. Из-за этого среда выполнения не может гарантировать, что поток всегда завершится после того, как вы его попросите.
ThreadAbortException
содержит больше:
Когда вызывается метод Abort для уничтожения потока, среда CLR генерирует исключение ThreadAbortException. ThreadAbortException - это специальное исключение, которое может быть перехвачено, но оно будет автоматически снова вызвано в конце блока перехвата. Когда возникает это исключение, среда выполнения выполняет все блоки finally перед завершением потока. Поскольку поток может выполнять неограниченные вычисления в блоках finally или вызывать
Thread.ResetAbort ()
для отмены прерывания, нет гарантии, что поток когда-либо завершится.
Вам не нужно Abort ()
поток вручную. CLR сделает за вас всю грязную работу, если вы просто позволите методу в потоке вернуться; это нормально завершит поток.
Что делать, если поток удерживает блокировку и прерывается / прекращается? Ресурсы остаются застрявшими
Он отлично работает, когда поток вызывает прерывание самого себя, но не другим потоком. Прерывание, принудительно завершает затронутый поток, даже если он еще не { {1}} выполнил свою задачу и не предоставляет возможности для очистки ресурсов
ссылка MSDN
ThreadAborts не будет происходить внутри блока finally или между BeginCriticalRegion и EndCriticalRegion
Это невозможно. Используйте функции рефакторинга 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 !
Потому что вы можете поймать ThreadAbortException
и вызовите Thread.ResetAbort
внутри обработчика.
Сначала можно использовать опцию -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 передается в мой код.
В каких случаях поток не прерывается?
Повторяющийся вопрос.
Что не так с использованием Thread.Abort ()
Есть ли другие возможности для завершения потоков?
Да. Ваша проблема в том, что вы никогда не должны запускать поток, который вы не можете вежливо сказать, чтобы он остановился, и он останавливается своевременно. Если вы находитесь в ситуации, когда вам нужно запустить поток, который (1) трудно остановить, (2) содержит ошибки или, что хуже всего, (3) враждебно настроен по отношению к пользователю, то правильным решением будет сделать новый процесс, запустите поток в новом процессе, а затем завершите процесс , когда вы хотите, чтобы поток остановился. Единственное, что может гарантировать безопасное завершение некооперативного потока, - это остановка всего процесса операционной системой.
См. Мой слишком длинный ответ на этот вопрос для более подробной информации:
Использование оператора блокировки в цикле в C #
Соответствующий бит - это бит в конце, где я обсуждаю, какие соображения касаются того, сколько времени вам следует подождите, пока поток не убьет себя, прежде чем прервать его.