Разница между прерыванием и прерыванием в потоках в .NET.

В чем разница между Thraed.Abort() и Thread.Interrupt(). Как я могу вызвать их в потоковом режиме Man.It будет полезно, если простой пример предоставляется.

Ответы

Ответ 1

Прежде всего, ни одна из них не является хорошими конструкциями синхронизации потоков.

Во-первых, Thread.Abort говорит: "Мне все равно, что вы делаете, просто прекратите это делать и оставите все как есть сейчас". Это в основном способ программирования: "Эй, избили". Если в вашем потоке открываются файлы, эти файлы останутся открытыми до тех пор, пока сбор мусора не начнет завершать ваши объекты.

Thread.Abort следует использовать только когда-либо, и даже тогда, вероятно, нет, в случае, когда домен приложения, в котором работает поток, разрушается, предпочтительно только тогда, когда процесс завершается.

Во-вторых, Thread.Interrupt - довольно странный зверь. В основном он говорит: "Мне все равно, чего ты ждешь, перестань ждать". Странная вещь здесь в том, что если нить в настоящее время не ждет чего-либо, вместо этого "мне все равно, что вы будете ждать следующего, но когда вы это сделаете, немедленно прекратите ее".

Оба эти являются признаками того, что вы навязываете свою волю в потоке, который не предназначен для того, чтобы рассказывать такие вещи.

Чтобы правильно прервать поток, поток должен периодически проверять какой-то флаг, будь то простая volatile Boolean variable или объект события. Если в флагове сказано: "Теперь вы должны закончить", поток должен завершиться, возвращаясь из методов упорядоченным образом.

Чтобы правильно пробудить поток, поток должен в тех местах, где он должен ждать объектов синхронизации, включить объект "Подождите, подождите", который он также ждет. Таким образом, в основном это будет либо для объекта, в котором он нуждается, либо для сигнала, либо для объекта "please stop waiting", который будет сигнализироваться, определить, какой из них сделал, и сделать правильную вещь.

Итак, вместо Thread.Abort и Thread.Interrupt вы должны писать свои потоки, используя обычные объекты синхронизации, такие как события, мьютексы, семафоры и т.д.

По той же причине Thread.Suspend и Thread.Resume должны быть оставлены в покое, и они также устарели в более поздних версиях .NET.

Ответ 2

Если вы не вызываете Abort или Interrupt в текущем исполняемом потоке (например, ASP.NET делает это для прерывания запроса, например), вы в принципе не можете называть их поточно-безопасным способом.

Используйте WaitHandle или Monitor.Wait/Pulse для ожидания в режиме пробуждения. Вы должны только прервать другие потоки, если вы срываете приложение, в основном - так как иначе вы можете оказаться в неизвестном состоянии.

См. мою статью об изящном завершении потока на примере того, как это сделать.

Ответ 3

Thread.Abort() вызывает исключение ThreadAbortException в целевом потоке. Он намерен в целом заставить поток прекратить работу. Это не рекомендуется для остановки обработки потоков.

Thread.Interrupt() прерывает поток, который находится в состоянии WaitSleepJoin - по существу, блокирует ресурс, например WaitHandle. Это позволяет вызывающему разблокировать поток.

Ни один из них не является "потокобезопасным" - в том смысле, что они специально предназначены для того, чтобы влиять на поведение потоков таким образом, который трудно предсказать.

Обычно рекомендуется использовать объекты синхронизации (например, WaitHandles или Semaphores), чтобы потоки могли безопасно синхронизировать друг с другом.

Ответ 4

Разница между Abort и Interrupt заключается в том, что в то время как оба они будут генерировать исключение (ThreadAbortException и ThreadInterruptException), вызов Abort повторит исключение в конце блока catch и обязательно завершит выполнение текущего потока.