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

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

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

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



답변

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이 작동하지 않는 이유는 무엇입니까?


답변

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

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.


답변

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

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


답변

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

Application.Exit ();

winform 또는

Environment.Exit (0);

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

감사!


답변

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

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

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

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


답변

당신은 :

Application.Run(myForm);

Main ()에서?

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


답변

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