Если поток выполняет функцию func1
это вызывает другую функцию func2
в нем...
Затем я назвал поток. Аварийное прекращение работы ()
Будет эта остановка func1
только
ИЛИ func1
и func2
и все функции func1
звонил??
Спасибо
Править: Вот больше детали:
func1
назван в новом потоке, он непрерывно звонит func2
на регулярной основе...
func2
начните делать некоторую работу, только если некоторый массив не является пустым.. это заканчивает его и возврат
Когда супервизор хочет сохранить данные, он прерывает Поток func1
- и затем делает пустой указатель массива, сохраняет данные, затем заполните массив с новым.. и запускает Поток с func1
снова..
Иногда исключение повышено, потому что массив пустой в func2
.. так func1 аварийное прекращение работы не влиял на func2
Thread.Abort
не гарантирует остановки потока, и вам следует по возможности избегать его использования.
Вызов этого метода обычно завершает поток.
Акцент мой.
Он вызывает исключение ThreadAbortException
в целевом потоке. Если вы поймаете это исключение, код продолжит выполнение до тех пор, пока не достигнет конца блока catch, после чего исключение будет автоматически создано повторно. Если вы его не поймаете, оно похоже на обычное исключение - оно распространяется вверх по стеку вызовов.
Если вы не поймаете исключение, весь код, выполняющийся в этом потоке, перестанет выполняться. Другие потоки, которые были запущены из этого потока, не будут затронуты.
Для тех, кому интересно:
После большей отладки я обнаружил, что поток инициализируется еще раз перед запуском; что заставляет поток работать в фоновом режиме...
Thread T
T=new Thread(func1);
// Some code...
// Start:
T=new Thread(func1);
Этот поток без ссылки в фоне не затрагивается Abort()... поэтому он будет продолжать работать и пытается использовать нулевой массив...
В конце:
Abort() завершит ваш поток, за исключением некоторых условий (упомянутых выше в чужом ответе)
Abort() не завершит поток после того, как на него не ссылаются (очевидно)
Спасибо!!!
Вы можете столкнуться с состоянием гонки, когда ваша основная процедура обнуляет массив до того, как ThreadAbortException достигает потока func1, но после того, как func2 проверяет наличие нулевого массива.
Как минимум, ваш основной код и func2 должны использовать блокировку вокруг массива. Вы также должны проверить, что поток func1 мертв, прежде чем перезапускать его снова. И, как уже говорили все, сигнализируйте потоку о прекращении, а не полагайтесь на Thread.Abort.
Из вашего описания я не уверен на 100%, что func2 вызывается из потока func1, но если func2 запускается в другом потоке, который запущен из func1, уничтожение потока func1 не повлияет на func2, поскольку все потоки существуют как дочерние элементы вашего родительского процесса, а не потока, из которого они были запущены.