Что не так с использованием Thread.Abort()
Поэтому я знаю, что вы не должны использовать
Thread.Abort()
Но мне никогда не давали хорошего объяснения. Есть ли штраф за исполнение или какая-то скрытая информация?
Я знаю, что вы не можете игнорировать/проглатывать ThreadAbortException (что имеет смысл)
Ответы
Ответ 1
В дополнение ко всем другим хорошим ответам здесь, позвольте мне добавить, что нет никакой гарантии, что вызов Thread.Abort фактически прервет нить, о которой идет речь, когда-либо. Возможно (хотя и не очень легко) "затвердеть" нить от прерывания. Если, например, вы прерываете поток, потому что считаете, что он работает с недружественным кодом, тогда враждебный код может сопротивляться его собственному уничтожению.
Если у вас есть длительная работа с кодом, который у вас нет, это должно быть очищено чисто, правильный способ сделать это - поставить этот код в свой собственный процесс, а не на свой собственный поток. (И желательно, чтобы в этом процессе был ограниченный доступ к приложениям с высокой степенью безопасности.) Затем вы можете просто убить процесс.
Короче говоря, Thread.Abort в лучшем случае свидетельствует о плохом дизайне, возможно, ненадежном и чрезвычайно опасном. Его следует избегать любой ценой; единственный раз, когда вы даже должны подумать о прерывании потока, - это какой-то код "аварийного выключения", в котором вы пытаетесь максимально снести приложениедомен.
Ответ 2
Потому что, если вы знаете, что поток находится в каком-то безопасном состоянии, в котором он может быть прерван, вы можете организовать лучшую связь и обеспечить чистоту потока.
Поток мог бы занять блокировку и оказаться в середине изменения какого-либо общего состояния, а Thread.Abort отменит блокировку и оставит общее состояние поврежденным.
Ответ 3
Легче навредить себе. Как утверждали другие, в коде возникает исключение, которое может произойти в любой точке. Это может быть хорошо, если вы ожидаете этого и закодировали таким образом, чтобы элегантно обрабатывать это исключение в любой момент, но некоторые люди не делают:
Monitor.Enter(obj);
// some code - if exception is raised here, then the lock isn't released
Monitor.Exit(obj)
IDisposable someCriticalResource = GetResource();
// some code - if exception is raised here, then the object isn't disposed
someCriticalResource.Dispose();
Кроме того, если вы работаете со многими людьми в команде, если у вас нет хороших обзоров кода, вы не можете гарантировать качество кода, с которым будете работать. Поэтому хорошо проповедовать gospal "no Thread.Abort()", чем заставить людей запоминать код, надежный против исключений, происходящих в любом месте этого кода.
Ответ 4
Короче.
Любой объект IDisposable не может быть удален. Любой заблокированный объект не может быть разблокирован. Все, что должно быть выполнено на 100%, никогда не будет выполнено.
Ответ 5
При вызове Thread.Abort() в другом потоке поток потока ThreadAbortException вводится в поток этого потока. Если вам повезет, код обработает эту скважину и прервется в четко определенном состоянии. Проблема в том, что у вас нет никакого способа выяснить, удастся ли вам в каждом случае, поэтому, если вы предпочитаете безопасное извинение, вызвав Thread.Abort в других потоках, это не очень хорошая идея.
Ответ 6
Thread.Abort останавливает поток в неконтролируемом режиме.
thread.Abort будет генерировать исключение, которое приведет к тому, что ваш поток немедленно остановится.
Что не так: в большинстве случаев вы хотите изящно прекратить выполняемую вами операцию. Например, если вы выполняете операцию ACID, вы можете завершить текущую операцию до окончания потока, чтобы ваша система оставалась в стабильном состоянии.
Ответ 7
Thread.Abort создает исключение в целевом потоке. В то же время целевой поток может выполнять некоторые критические операции, и рост исключения может привести к поломке вашего состояния приложения.