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);
}
답변
나는 이것이 당신이 가진 문제가 아니라는 것을 알고 있지만, 이것이 일어날 수있는 또 다른 이유는 응용 프로그램에서 백그라운드 스레드가 열려 있지 않기 때문입니다.
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
는 스레드가 완료까지 열려있는 프로그램을 유지할 것이다, 당신이 설정 한 경우 IsBackground
에 true
실 개방 프로그램을 유지하지 않습니다. 상황이 좋아하는 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