2009-05-25 5 views
16

Application.Shutdown을 호출 할 때 응용 프로그램을 종료 할 수없는 경우가 있지만 UI가 닫혔지만 프로세스가 계속 실행 중입니다. 모든 스레드를 닫은 채로 응용 프로그램을 종료하는 방법은 무엇입니까? Environment.Exit()은 모든 스레드를 닫을 수 있습니까? 또는 Win32 API TerminateThread을 호출해야합니까?Environment.Exit()과 Application.Shutdown() 사이의 차이점은 무엇입니까?

답변

17

Environment.Exit()은 응용 프로그램을 종료하는 더 잔인한 방법입니다.하지만 일반적으로 응용 프로그램을 종료해야 응용 프로그램을 종료해야합니다. 잘못된 방법으로 문제를보고 있다고 생각합니다. 왜 다른 스레드가 정상적으로 닫히지 않는지 확인해야합니다.

주 폼에서 FormClosing event을 조사하고 응용 프로그램을 끊어 버리는 것을 막을 수있는 리소스를 닫을 수 있습니다.

이것은 앱을 중단하는 리소스를 찾는 방법입니다. 디버그 모드에서

  1. 이 제대로 닫히지 않습니다하는 방식에 응용 프로그램을 닫습니다 (이것은 당신이 응용 프로그램을 실행하는 모든 스레드를 볼 수 있습니다) threads의 전시를 할 수 있습니다.
  2. 비주얼 스튜디오에서 일시 중지를 누르십시오.
  3. 스레드 목록을보고 int가 그가 매달린 코드 위치를 보려면 클릭하십시오. 이제 어떤 리소스가 닫히지 않고 애플리케이션을 차단하는지 볼 수 있으므로 FormClosing 이벤트로 이동하십시오. 닫고 거기서 버리십시오. 당신이 클릭 할 때 응용 프로그램 전까지
  4. 반복

디버그 모드에서 스레드 목록이이 스레드가 rarly 이름이 아니라 당신의 통제하에 실행되는 일부 스레드를 표시합니다주의하십시오 : 제대로 닫히고 그들에게 기호가 없다는 메시지가 나타납니다. 이들은 무시할 수 있습니다.

응용 프로그램이 정상적으로 종료되는지 확인하는 이유 중 하나는 일부 자원 (FileStream)이 작동하지 않으면 일부 API를 사용하여 빠르게 강제로 모든 종류를 만들 수 있다는 것입니다 설정/데이터 파일이 쓰여지지 않는 것처럼 "임의"문제가 발생합니다.

+0

'Application.Shutdown'이라고도 불리는 응답을 주셔서 감사합니다.하지만 여전히 프로세스가 실행되고있는 것은 아니며, 어떤 스레드가 실행되고 있는지 발견하기 위해 노력했지만이 버그는 다시 생성되지 않았습니다 ... –

8
  1. 당신은 결코 전화 TerminateThread
  2. 는 산란 모든 스레드가 배경, 당신이 그 (것)들을 완료하기 위해 기다릴 것입니다 응용 프로그램을 닫습니다 이런 식으로 표시가 있는지 확인해야한다.
+0

오, 굉장해. # 2 할 수 있다는 것을 몰랐습니다. – Joel

+1

IsBackground가이 문제를 해결했습니다. 매우 유용하고 놀라지 만 더 널리 알려지지 않았습니다. – SouthShoreAK

1

Shay가 말했듯이 TerminateThread는 결코 절대로 하나의 스레드를 종료시키지 않고 프로세스 자체의 다른 스레드에서 교착 상태와 손상을 일으킬 수 있습니다.

다른 프로세스의 TerminateProcess는 전체 프로세스를 중단시키고 OS를 정리하도록합니다. 프로세스를 종료하는 가장 빠른 방법입니다. OS에서 정리할 수없는 리소스가 없는지 확인해야합니다. TerminateProcess를 호출하기 전에 창을 닫는 것도 도움이됩니다.)

나는 생각하지만 Environemnt.Exit이 TerminateProcess를 호출했는지 확인하지 않았습니다.

Application.Shutdown은 프로세스가 즉시 종료되지 않으며 모든 종료 및 종료 알림을 보내고 모든 응용 프로그램의 창과 스레드가 닫힐 때까지 대기합니다.

관련 문제