C # 응용 프로그램을 올바르게 종료하는 방법은 무엇입니까?


198

C #에 게시 된 응용 프로그램이 있습니다. 여기서 문제는 빨간색 종료 버튼을 클릭하여 주 양식을 닫을 때마다 양식이 닫히지 만 응용 프로그램은 닫히지 않습니다. 컴퓨터를 종료하려고 할 때이 사실을 알았습니다. 내가 만든 응용 프로그램이 원활하게 실행되기를 바랍니다 MessageBox. 알림 을 넣은 많은 자식 창에 충격을 받았습니다 .

나는 시도 Application.Exit했지만 여전히 모든 자식 창과 경고를 호출하고 사용 방법 Environment.Exit과 어떤 정수를 넣을 지 모른다.

그건 그렇고, 내 양식이 formclosed또는 form closing이벤트를 호출 할 때마다 this.Hide()함수로 응용 프로그램을 닫습니다 . 내 응용 프로그램의 작동 방식에 영향을 줍니까?


2
FormClosed 또는 FormClosing을 처리하지 마십시오
SLaks

1
따라서 양식을 닫는 대신 숨기고 있다고 말 합니까? 아마도 응용 프로그램이 종료되지 않는 이유 일 수 있으며 여전히 열린 (숨겨진) 양식이 있습니다.
Xint0

그런 다음 this.Hide ()를 this.Close ()로 바꾸어야합니까?
존 어니스트 과달 루페

1
Hide () 또는 Close ()가 필요하지 않습니다.
Henk Holterman

1
닫기 조치 및 이벤트에 관한 코드를 게시하십시오.
Henk Holterman

답변:


330

MSDN에서 :

신청. 종료

모든 메시지 펌프에 종료해야 함을 알리고 메시지가 처리 된 후 모든 응용 프로그램 창을 닫습니다. Application.Run (WinForms 응용 프로그램)이라고하는 경우 사용할 코드입니다.이 메서드는 모든 스레드에서 실행중인 모든 메시지 루프를 중지하고 응용 프로그램의 모든 창을 닫습니다.

환경. 종료

이 프로세스를 종료하고 기본 운영 체제에 지정된 종료 코드를 제공합니다. 콘솔 응용 프로그램을 사용할 때 호출하는 코드입니다.

이 기사 인 Application.Exit vs. Environment.Exit 는 유용한 팁을 제시합니다.

속성 System.Windows.Forms.Application.Run을 확인하여 호출 되었는지 확인할 수 있습니다 System.Windows.Forms.Application.MessageLoop. true이면 Run이 호출되었고 WinForms 응용 프로그램이 다음과 같이 실행되고 있다고 가정 할 수 있습니다.

if (System.Windows.Forms.Application.MessageLoop) 
{
    // WinForms app
    System.Windows.Forms.Application.Exit();
}
else
{
    // Console app
    System.Environment.Exit(1);
}

참조 : Application.Exit이 작동하지 않는 이유는 무엇입니까?


인수가있는 WinForms 앱이있어서 자동으로 실행될 수 있으므로 양식을 표시하지 않았기 때문에 이것은 정말 유용했습니다. 양식이 숨겨 졌을 때 Application.Exit()앱을 종료하지 못했지만 Environment.Exit(1)매력처럼 작동했습니다.
Dib

5
이 질문은 오류로 인한 종료를 언급하지 않았으므로 종료 코드는 0이어야합니다. 0 Environment.Exit(0) 이 아닌 값은 스크립트가 적절한 조치를 수행하는 데 사용할 수있는 응용 프로그램 특정 오류 코드입니다. (이것은 새로운 코드이며 WinForms 응용 프로그램
이므로이

Environment.Exit양식 응용 프로그램에도 사용할 수 있습니다.
Badiparmagi

1
내가 틀렸다면 저를 정정하십시오.하지만 return나중에 진술 이이 접근법을 많이 향상시킬 것이라고 생각합니다 . 내가 이해했듯이 코드는 명령문 Application.Exit()까지 계속 실행 return됩니다.
Bighted19

17

나는 이것이 당신이 가진 문제가 아니라는 것을 알고 있지만, 이것이 일어날 수있는 또 다른 이유는 응용 프로그램에서 백그라운드 스레드가 열려 있지 않기 때문입니다.

using System;
using System.Threading;
using System.Windows.Forms;

namespace Sandbox_Form
{
    static class Program
    {
        private static Thread thread;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            thread = new Thread(BusyWorkThread);
            thread.IsBackground = false;
            thread.Start();

            Application.Run(new Form());

        }

        public static void BusyWorkThread()
        {
            while (true)
            {
                Thread.Sleep(1000);
            }
        }
    }
}

IsBackground이다 false는 스레드가 완료까지 열려있는 프로그램을 유지할 것이다, 당신이 설정 한 경우 IsBackgroundtrue실 개방 프로그램을 유지하지 않습니다. 상황이 좋아하는 BackgroundWoker, ThreadPool그리고 Task모두 내부적으로 스레드를 사용 IsBackground으로 설정 true.


14

당신이 필요한 전부 System.Environment.Exit(1);

그리고 프로젝트를 시작할 때 항상 존재하는 "시스템 사용"이라는 시스템 네임 스페이스를 사용합니다.


2
콘솔 응용 프로그램에만 적합합니다.
Nidhin David

한 가지 주목할 점은 FormClosing / FormClosed 이벤트가 환경에 대해 호출되지 않는다는 것입니다. 또한 ExitCode는 오류가 발생한 경우에만 0이 아니어야합니다.
Raphael Smit

10

다음 중 하나를 수행합니다.

Application.Exit ();

winform 또는

Environment.Exit (0);

콘솔 응용 프로그램 (winforms에서도 작동).

감사!


Environment.Exit (0)도 WinForms에서도 작동하며 예외를 발생시키지 않고 응용 프로그램이 존재합니다.
MulleOne

8

그건 그렇고 내 폼이 formclosed 또는 폼 닫기 이벤트를 호출 할 때마다 this.Hide () 함수로 applciation을 닫습니다. 내 응용 프로그램의 작동 방식에 영향을 줍니까?

한마디로 그렇습니다. 기본 양식 ( 메서드 Application.Run에서 시작된 양식 Main)이 닫히면 (숨겨지지 않음) 전체 애플리케이션이 종료됩니다 .

기본 양식이 닫힐 때마다 전체 응용 프로그램이 항상 완전히 종료되어야하는 경우 해당 양식 닫힌 처리기를 제거하면됩니다. 해당 이벤트를 취소하지 않고 사용자가 닫을 때 이벤트를 닫도록하면 원하는 동작을 얻을 수 있습니다. 다른 모든 양식과 마찬가지로 양식의 동일한 인스턴스를 다시 표시하지 않으려면 폐쇄를 막고 숨기지 말고 닫으십시오. 다시 표시하면 숨길 수 있습니다.

사용자가 기본 양식의 "x"를 클릭하도록하고 다른 양식을 열어두고 실제로 "새"기본 양식이되도록하려면 조금 더 복잡합니다. 이 경우 기본 양식을 닫는 대신 숨기면되지만 실제로 앱을 종료하려는 경우 기본 양식을 닫는 메커니즘을 추가해야합니다 . 이것이 당신이 처한 상황이라면 어떤 유형의 응용 프로그램이 실제로 프로그램을 끝내고 끝내지 않아야하는지 설명하는 질문에 더 많은 세부 사항을 추가해야합니다.


3

당신은 :

Application.Run(myForm);

Main ()에서?

양식을 닫을 때 응용 프로그램을 종료하는 매우 쉬운 방법을 찾았습니다.


1
예. Main의 Program.cs 파일에 Application.Run이 있습니다. 닫으려면 어떻게해야합니까?
존 어니스트 과달 루페

하지만 당신은 메인 폼을 Run으로 전달합니까? 양식 닫고 빨간색 X를 클릭하여
LightStriker

예, 선생님이 있습니다. 다음과 같습니다. Application.Run (new Form2 ());
존 어니스트 과달 루페

이 경우 실행으로 전달 된 기본 양식이 완전히 완전히 닫히면 응용 프로그램이 자동으로 종료됩니다. 그런 다음 해당 양식이 여전히 열려 있거나 실행 중이거나 숨겨져있는 이유를 추적해야합니다.
LightStriker

3
Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error

-4

이 경우 App.xaml.cs의 onExit () 메서드를 재정의하기 위해 응용 프로그램을 종료하는 가장 적절한 방법은 다음과 같습니다.

protected override void OnExit(ExitEventArgs e) {
    base.OnExit(e); 
}

종료 이벤트가 발생할 때마다 코드를 실행할 수 있지만 실제로 종료 이벤트가 발생하지는 않습니다.
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.