Могу ли я обнаружить, когда фоновый поток был убит приложением, когда приложение закрывается?

Я использую поток в С#, где я установил свойство IsBackground значение true. Поток запускает некоторый код в цикле, пока приложение не закроется. Когда приложение закрыто, поток также прекращает выполнение (потому что я установил IsBackground = true).

Как приложение уничтожает поток? Кажется, что он не делает этого, вызывая прерывание, потому что я не получаю исключение ThreadAbortException. Это происходит за кулисами? Я хотел бы сделать откат в моем последнем блоке цикла.

Я знаю, что могу просто вызвать прерывание в потоке самостоятельно, но я хочу знать, как приложение закрывает мой фоновый поток, и если я могу реагировать на него изнутри потока. Я знаю, что могу подписаться на событие Application.ApplicationExit, но я запускаю этот код как в службе, так и в winform, и я бы предпочел поймать исключение внутри цикла, чтобы я смог откат в заявлении finally.

Ответ 1

Кажется, что он не делает этого, вызывая прерывание, потому что я не получаю исключение ThreadAbortException

Он делает, CLR имеет два способа прервать поток. "Обычный" способ, вызывается через Thread.Abort(), поток может видеть исключение ThreadAbortException. Но есть и грубое прерывание, работает одинаково. Но минус TAE и никакие окончательные блоки не выполняются. Вы не можете это наблюдать.

Ответ 2

Запущен thread переходит в состояние выполнения (т.е. начинает выполнение), когда операционная система назначает процессор thread. Когда поток Started получает процессор в первый раз и становится бегущим потоком, поток выполняет свой ThreadStart delegate, который определяет действия, которые поток будет выполнять во время его жизненного цикла. Когда программа создает новый поток, программа указывает Thread ThreadStart delegate как аргумент конструктора Thread.

A Запуск потока входит в состояние Stopped (or Dead), когда его ThreadStart delegate завершается. В вашем случае ваш основной поток завершается. Таким образом, ваш объект ThreadStart delegate не сохраняется в памяти. Когда ссылки на объект потока отсутствуют, сборщик мусора может удалить объект потока из памяти.