Поток может достичь состояния Stopped несколькими способами:
- Это основной метод может выйти без ошибок.
- Неопределенное исключение в потоке может прервать его.
- Другой поток может вызвать Thread.Abort (), что вызовет исключение ThreadAbortException в этом потоке.
Я не знаю, хотите ли вы провести различие между всеми тремя состояниями, но если все, что вас действительно интересует, это то, успешно ли завершен поток, я бы предложил использовать какую-либо общую структуру данных (синхронизированный словарь работа), что основной цикл потока обновляется по мере его завершения. Вы можете использовать свойство ThreadName в качестве ключа в этом общем словаре. Другие потоки, которые заинтересованы в состоянии завершения, могут читать из этого словаря, чтобы определить окончательное состояние потока.
Изучив документацию MSDN , вы сможете различить внешне прерванный поток, используя свойство ThreadState
. Это должно быть установлено на ThreadState.Aborted
, когда поток отвечает на вызов Abort (). Однако, если у вас нет контроля над выполняемым кодом потока, я не думаю, что вы сможете различить поток, который только что вышел из основного метода, и поток, который завершился с исключением.
Имейте в виду, однако, что если вы управляете кодом, который запускает поток, вы всегда можете заменить свой собственный метод, который внутренне вызывает код, который выполняет логику основного потока и обнаруживает исключения исключений (как я описал) выше) там.