2012-06-13 4 views
11

C#에서 IsBackground 속성을 true로 설정 한 스레드를 사용하고 있습니다. 스레드는 응용 프로그램이 닫힐 때까지 루프에서 일부 코드를 실행 중입니다. 응용 프로그램이 닫히면 스레드가 실행을 멈 춥니 다 (IsBackground = true로 설정했기 때문에).응용 프로그램이 닫힐 때 백그라운드 스레드가 응용 프로그램에 의해 종료 될 때를 감지 할 수 있습니까?

어떻게 응용 프로그램이 스레드를 죽입니까? ThreadAbortException을 얻지 못하기 때문에 중단을 호출하여 처리하지 않는 것 같습니다. 그 장면 뒤에서 일어날까요? 루프의 마지막 블록에서 롤백을하고 싶습니다.

스레드에서 직접 중단을 호출 할 수 있지만 응용 프로그램이 백그라운드 스레드를 닫는 방법과 스레드 내부에서 반응 할 수 있는지 알고 싶습니다. Application.ApplicationExit 이벤트를 구독 할 수 있지만이 코드는 서비스 및 winform에서 실행 중이므로 finally 문에서 롤백 할 수 있도록 루프 내부에서 예외를 catch하는 것이 좋습니다.

+0

전경 스레드로 만들고 스레드를 수동으로 닫는 '전역'응용 프로그램 종료 시나리오를 만들 수 있습니다. – CodingBarfield

+0

[AppDomain.ProcessExit] (http://msdn.microsoft.com/en-us/library/system.appdomain.processexit.aspx) 이벤트를 보셨습니까? – Botz3000

+0

그래서 당신은 그 장면의 뒤에서 일어난다 고 말하고 있습니다. 나는 이런 종류의 맞춤 솔루션을 만드는 것 이외에는 그것에 반응 할 수 없습니다. –

답변

5

그것이 내가 ThreadAbortException이 그것은 않습니다

을하지 않기 때문에 중단 호출하여 작업을 수행하지 않는 것, CLR은 스레드를 중단하는 방법은 두 가지가 있습니다. Thread.Abort()를 통해 호출 된 "정상적인"방법으로 스레드는 ThreadAbortException을 볼 수 있습니다. 그러나 무례한 중단도 있고, 같은 방식으로 작동합니다. 그러나 TAE를 빼고 마침내 블록이 실행되지 않습니다. 너는 그것을 관찰 할 수 없다.

+0

아하 .. 그걸 정리 해줘서 고마워. 이 문서를 찾을 수 없습니다. –

+0

MSDN에서 실수였습니까? http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx 공용 언어 런타임 (CLR) 관리되는 실행 파일의 모든 전경 스레드가 끝난 후 백그라운드 스레드를 중지 할 때 Thread.Abort 사용하지 않습니다. 따라서 ThreadAbortException을 사용하여 백그라운드 스레드가 CLR에 의해 종료되는시기를 감지 할 수 없습니다. – Eldar

+0

해당 MSDN 문서와이 답변 사이에 어떤 불일치도 없습니다. 무례 중단은 응용 프로그램 코드에 의해 트리거 될 수 있지만 AppDomain.Unload 또는 Environment.Exit가 필요합니다. 보통 스레드를 중단하는 방법으로 먼저 생각하는 메서드가 아닙니다. :) –

1

시작 thread은 운영 체제가 thread에 프로세서를 할당 할 때 실행 중 상태 (running)로 들어갑니다 (즉, 실행을 시작 함). Started 스레드가 처음으로 프로세서를 받고 Running 스레드가되면 스레드는 해당 ThreadStart delegate을 실행합니다. 스레드는 해당 수명주기 동안 스레드가 수행 할 동작을 지정합니다. 프로그램이 새로운 스레드를 생성 할 때, 프로그램은 스레드의 ThreadStart delegate을 스레드 생성자의 인수로 지정합니다.

실행중인 스레드가 ThreadStart delegate이 종료되면 Stopped (or Dead) 상태가됩니다. 귀하의 경우 메인 스레드가 종료됩니다. 따라서 ThreadStart delegate 개체가 메모리에 남아 있지 않습니다. 스레드 개체에 대한 참조가 없으면 가비지 수집기는 메모리에서 스레드 개체를 제거 할 수 있습니다.

+0

감사합니다. Botz3000이 제안한대로 AppDomain.ProcessExit 이벤트를 사용하여 종료되었습니다. 그런 다음이 이벤트가 발생할 때 thread.Abort()를 호출 할 수 있습니다. 잘 작동하는 것 같습니다. –

+0

이 대답은 잘못되었습니다. 버려진 백그라운드 스레드는 수집 한 GC에 의해 중단되지 않습니다. 관리 대상 스레드 객체에 대한 강력한 참조와 상관없이 런타임에 의해 강제로 중단됩니다. 설명을 보려면 한스의 대답을 참조하십시오. – Josh

+0

@JoshEinstein : 올바른 것일 수 있습니다. 그러나 Hans는 CLR이 스레드를 비정상적으로 중단하는 방법을 설명하지 않았습니다 .... 설명해 주실 수 있습니까? – Talha

관련 문제