닷넷에서 응용프로그램을 종료할 때 사용하는 명령은 크게 3가지입니다.
Application.Exit()
Environment.Exit(0)
System.Diagnostics.Process.GetCurrentProcess().Kill();
이 포스팅에서는 이 3가지의 차이점을 알아봅니다.
샘플을 실행해보고 보면서 확인하면 더 이해하기 쉽습니다.
샘플 : github - dang-gun/DotNetSamples/ExitTest/
내부에 종료를 알리고 모든 메소드가 끝나면 종료됩니다.
참고 : MS Docs - Application.Exit 메서드
설명이 복잡하지만.....
간단하게 말하면 애플리케이션에 정상종료를 요청한다는 의미입니다.
그래서 모든 종료 관련 동작들이 완료되면 응용프로그램이 종료됩니다.
샘플을 실행시키고
'Foreground End' 버튼을 누른 다음
'Application.Exit()' 버튼을 눌러봅시다.
'FormClosed' 이벤트까지 정상적으로 호출되고 나서 프로그램이 종료되는 것을 알 수 있습니다.
'정상 종료'라는 것은 결국 동작 중인 모든 처리가 끝나야 한다는 것이고
이 처리에는 쓰래드도 포함됩니다.
만약 무한으로 돌고 있는 쓰래드(Thread)가 있다면 종료되지 않습니다.
샘플을 다시 실행하고
'Foreground End' 버튼을 누르지 말고
'Application.Exit()' 버튼을 눌러봅시다.
이러면 포그라운드(Foreground) 쓰래드가 돌고 있어서 프로그램이 종료되지 않습니다.
단, 백그라운드 쓰래드는 상관없이 종료됩니다.
'Environment.Exit(0)'는 운영체제에 정상 종료(0)를 알리고 종료됩니다.
참고 : MS Docs - Environment.Exit(Int32) 메서드
매개변수는 운영체제에 알릴 오류 코드입니다.
0은 정상종료
나머지는 오류 코드입니다.
전달한 코드값이 표시됩니다.
포그라운드 쓰래드도 종료시킵니다.
그래서 이 메소드를 많이 사용하죠.
강제로 프로세스를 종료시킵니다.
참고 : MS Docs - Process.Kill 메서드
흔히 '프로세스 킬'이라고 부르는 메서드입니다.
작업 관리자에서 '작업 끝내기'와 비슷하다고 생각하면 편합니다.
프로세스를 강제로 종료시키는 것이다보니 자원해제가 재대로 안될 가능성이 있습니다.
'Application.Exit()'만 사용할 수 있다면 가장 좋은 상황이라고 할 수 있습니다.
문제는 그렇게 베스트인 상황만 있는 게 아니라는 게.....