Запуск потока без надежного способа его завершения - плохая практика.Приостановить / прервать - один из ненадежных способов завершить поток, потому что вы можете завершить поток в состоянии, которое повреждает всю вашу программу, и у вас нет никакого способа избежать этого.
Вы можете увидеть, как убитьпоток в безопасности здесь: Уничтожение потока .NET
Если «пользователь» дает вам метод для выполнения в потоке, то пользователь должен также дать вам метод, чтобы остановитькод от запуска.Думайте об этом как о контракте: вы обещаете пользователю, что вызовете метод stop, а они обещают, что метод stop фактически остановит поток.Если ваш пользователь нарушает этот контракт, он будет нести ответственность за возникающие проблемы, что хорошо, потому что вы не хотите отвечать за ошибки вашего пользователя:).
Обратите внимание, что я не могу принудительнопрограммист функций для перехвата ThreadAbortException.
Поскольку приостановка / прерывание - плохая практика, программисту не нужно перехватывать ThreadAbortException
, однако они должны перехватывать ThreadInterruptedException
как частьих "контракта".
Помните, что вам нужно беспокоиться о двух ситуациях:
- Поток выполняет некоторый код.
- Поток находится в состоянии блокировки.
В случае, если поток выполняет некоторый код, все, что вы можете сделать, это уведомить поток о том, что он может выйти, и дождаться егообрабатывает уведомление.Вы также можете пропустить ожидание и предположить, что вы пропустили ресурс, и в этом случае это снова ошибка пользователя, потому что он не разработал свой метод stop для своевременного завершения потока.
ВВ случае, когда поток находится в состоянии блокировки, и он не блокирует конструкцию уведомления (например, семафор, событие ручного сброса и т. д.), вы должны вызвать Thread.Interrupt()
, чтобы вывести его из состояния блокировки - пользователь должен обработать ThreadInterruptedException
.