Ответ 1
Прежде всего, ни одна из них не является хорошими конструкциями синхронизации потоков.
Во-первых, Thread.Abort говорит: "Мне все равно, что вы делаете, просто прекратите это делать и оставите все как есть сейчас". Это в основном способ программирования: "Эй, избили". Если в вашем потоке открываются файлы, эти файлы останутся открытыми до тех пор, пока сбор мусора не начнет завершать ваши объекты.
Thread.Abort следует использовать только когда-либо, и даже тогда, вероятно, нет, в случае, когда домен приложения, в котором работает поток, разрушается, предпочтительно только тогда, когда процесс завершается.
Во-вторых, Thread.Interrupt - довольно странный зверь. В основном он говорит: "Мне все равно, чего ты ждешь, перестань ждать". Странная вещь здесь в том, что если нить в настоящее время не ждет чего-либо, вместо этого "мне все равно, что вы будете ждать следующего, но когда вы это сделаете, немедленно прекратите ее".
Оба эти являются признаками того, что вы навязываете свою волю в потоке, который не предназначен для того, чтобы рассказывать такие вещи.
Чтобы правильно прервать поток, поток должен периодически проверять какой-то флаг, будь то простая volatile Boolean variable или объект события. Если в флагове сказано: "Теперь вы должны закончить", поток должен завершиться, возвращаясь из методов упорядоченным образом.
Чтобы правильно пробудить поток, поток должен в тех местах, где он должен ждать объектов синхронизации, включить объект "Подождите, подождите", который он также ждет. Таким образом, в основном это будет либо для объекта, в котором он нуждается, либо для сигнала, либо для объекта "please stop waiting", который будет сигнализироваться, определить, какой из них сделал, и сделать правильную вещь.
Итак, вместо Thread.Abort и Thread.Interrupt вы должны писать свои потоки, используя обычные объекты синхронизации, такие как события, мьютексы, семафоры и т.д.
По той же причине Thread.Suspend и Thread.Resume должны быть оставлены в покое, и они также устарели в более поздних версиях .NET.