Могу ли я обнаружить, когда фоновый поток был убит приложением, когда приложение закрывается?
Я использую поток в С#, где я установил свойство 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
не сохраняется в памяти. Когда ссылки на объект потока отсутствуют, сборщик мусора может удалить объект потока из памяти.