Потоки C#. Аварийное прекращение работы ()

Если поток выполняет функцию func1 это вызывает другую функцию func2 в нем...

Затем я назвал поток. Аварийное прекращение работы ()

Будет эта остановка func1 только
ИЛИ func1 и func2 и все функции func1 звонил??

Спасибо

Править: Вот больше детали:

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

Когда супервизор хочет сохранить данные, он прерывает Поток func1- и затем делает пустой указатель массива, сохраняет данные, затем заполните массив с новым.. и запускает Поток с func1 снова..

Иногда исключение повышено, потому что массив пустой в func2.. так func1 аварийное прекращение работы не влиял на func2

6
задан Betamoo 24 May 2010 в 20:26
поделиться

4 ответа

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

Вызов этого метода обычно завершает поток.

Акцент мой.

Он вызывает исключение ThreadAbortException в целевом потоке. Если вы поймаете это исключение, код продолжит выполнение до тех пор, пока не достигнет конца блока catch, после чего исключение будет автоматически создано повторно. Если вы его не поймаете, оно похоже на обычное исключение - оно распространяется вверх по стеку вызовов.

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

14
ответ дан 8 December 2019 в 13:44
поделиться

Все, что было начато в этом потоке, будет прервано.

3
ответ дан 8 December 2019 в 13:44
поделиться

Для тех, кому интересно:
После большей отладки я обнаружил, что поток инициализируется еще раз перед запуском; что заставляет поток работать в фоновом режиме...

    Thread T
    T=new Thread(func1);
    // Some code...
    // Start:
    T=new Thread(func1);

Этот поток без ссылки в фоне не затрагивается Abort()... поэтому он будет продолжать работать и пытается использовать нулевой массив...

В конце:
Abort() завершит ваш поток, за исключением некоторых условий (упомянутых выше в чужом ответе)
Abort() не завершит поток после того, как на него не ссылаются (очевидно)

Спасибо!!!

0
ответ дан 8 December 2019 в 13:44
поделиться

Вы можете столкнуться с состоянием гонки, когда ваша основная процедура обнуляет массив до того, как ThreadAbortException достигает потока func1, но после того, как func2 проверяет наличие нулевого массива.

Как минимум, ваш основной код и func2 должны использовать блокировку вокруг массива. Вы также должны проверить, что поток func1 мертв, прежде чем перезапускать его снова. И, как уже говорили все, сигнализируйте потоку о прекращении, а не полагайтесь на Thread.Abort.

Из вашего описания я не уверен на 100%, что func2 вызывается из потока func1, но если func2 запускается в другом потоке, который запущен из func1, уничтожение потока func1 не повлияет на func2, поскольку все потоки существуют как дочерние элементы вашего родительского процесса, а не потока, из которого они были запущены.

0
ответ дан 8 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: