Когда Thread.Abort() фактически не прервется?

Итак, вы прочитали заголовок, когда Thread.Abort() фактически не прервется? Я слышал, как многие люди говорят, что это опасная команда и что никогда не гарантируется ее работа, но мне никогда не удавалось воспроизвести это. У меня всегда получалось..

Существуют ли какие-либо конкретные ситуации, которые могут привести к сбою Thread.Abort() постоянно?


person caesay    schedule 08.05.2011    source источник


Ответы (2)


Вы вообще читали документацию?

Не гарантируется, что поток прервется немедленно или вообще прервется. Такая ситуация может возникнуть, если поток выполняет неограниченное количество вычислений в блоках finally, которые вызываются как часть процедуры прерывания, тем самым откладывая прерывание на неопределенное время. Чтобы дождаться прерывания потока, вы можете вызвать метод Join в потоке после вызова метода Abort, но нет гарантии, что ожидание закончится.

...

Если Abort вызывается для потока, который не был запущен, поток будет прерван при вызове Start. Если Abort вызывается для заблокированного или спящего потока, поток прерывается, а затем прерывается.

Если Abort вызывается для приостановленного потока, в потоке, вызвавшем Abort, создается исключение ThreadStateException, а AbortRequested добавляется к свойству ThreadState прерываемого потока. Исключение ThreadAbortException не создается в приостановленном потоке до тех пор, пока не будет вызвано Resume.

Если Abort вызывается в управляемом потоке во время выполнения неуправляемого кода, исключение ThreadAbortException не создается до тех пор, пока поток не вернется к управляемому коду.

Если два вызова Abort поступают одновременно, один вызов может установить информацию о состоянии, а другой вызов выполнить Abort. Однако приложение не может обнаружить эту ситуацию.

После вызова Abort в потоке состояние потока включает AbortRequested. После завершения потока в результате успешного вызова Abort его состояние изменяется на Stopped. При наличии достаточных разрешений поток, являющийся целью Abort, может отменить прерывание с помощью метода ResetAbort. Пример, демонстрирующий вызов метода ResetAbort, см. в классе ThreadAbortException.

person ta.speot.is    schedule 08.05.2011
comment
спасибо .. я искал ответ в Google, но не нашел документации в результатах поиска, возможно, в будущем я более внимательно изучу msdn. - person caesay; 08.05.2011
comment
не думал искать так просто. - person caesay; 08.05.2011
comment
@ ta.speot.is Жалко, что у вас мало голосов, это лучший ответ на тему Thread.Abort, который я когда-либо видел :). - person ipavlu; 03.07.2017

Также существует ситуация, когда вызов Thread.Abort() не завершается ошибкой, но поток не завершается. Создаваемое ThreadAbortException может быть перехвачено самим потоком. Если это произойдет, а затем вызовет Thread.ResetAbort() в обработчике catch, исключение ThreadAbortException не будет сгенерировано повторно в конце блока catch.

person Metro    schedule 18.02.2020