2009-02-09 3 views
5

응용 프로그램이 종료 될 때 코드 라이브러리에 알림을 보내야합니다. 따라서 우리는 System.Window.Forms.Application.ApplicationExit 이벤트를 구독했습니다. 이 Winforms 애플 리케이션을 위해 잘 작동하지만 콘솔 응용 프로그램, 서비스 및 웹 응용 프로그램 (예 : ASP.NET) 같은 다른 유형의 응용 프로그램에 대해 작동합니까? 네임 스페이스는 그렇지 않으며 아마도 Application.Exit()이 (명시 적으로 또는 암시 적으로) 호출 될 때 발생한다고 추측 할 수 있습니다. 이는 다른 경우를 호출하는 것이 정확하지 않을 수 있습니다.Application.ApplicationExit 이벤트가 비 Winforms 앱에서 종료 알림을 받습니까?

이러한 다른 경우에 더 좋을 수도 있고 보편적 일 수도있는 다른 이벤트가 있습니까 (Winforms에서도 작동하면 좋음). 예를 들어 Environment.Exit() (콘솔 앱)이 호출 된 일정이 있습니까?

System.Diagnostic.Process에서 Exited 이벤트에 대한 언급이 발견되었지만 다른 프로세스의 exit를 모니터링하는 것으로 보입니다. 프로세스 자체에서 수신 한 것처럼 보입니다 (예 : , Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;). 프로세스가 실제로 종료 된 후에 만 ​​발생한다고 생각할 수 있습니다. 따라서 작동하지 않습니다.

특히 .NET 2.0 및 C#의 경우입니다.

답변

9

우리는 마침내 이것에 대해 더 많은 것을 발견했습니다 (하지만 내 컴퓨터가 다시 작성되어 내 등록되지 않은 프로필의 쿠키를 잃어 버렸습니다. 잘하면이 답변을 게시 할 예정입니다).

추가 조사는 결국 몇 가지 더 우리가 도움이 발견 이벤트 발견 :

System.Windows.Forms.Application.ThreadExit - 모든 메시지가 종료 System.AppDomain.CurrentDomain.DomainUnload 루프 때 화재 - - 메시지 루프가 System.Windows.Forms.Application.ApplicationExit를 종료 할 때 불을 불을 때 기본값이 아닌 다른 도메인 종료 System.AppDomain.CurrentDomain.ProcessExit - 기본 앱 도메인이 종료되면 실행됩니다. System.AppDomain.CurrentDomain.UnhandledException - 캐치되지 않는 예외가 발생하면 앱이 종료됩니다.

프로세스의 기본 (최상위) 도메인인지 하위 도메인 (예 : 웹 서버)인지에 따라 특정 앱 도메인에 대해 DomainUnload 또는 ProcessExit 이벤트 중 하나만 가능합니다. . 응용 프로그램이 어떤 것인지를 모르는 경우 (우리의 경우와 같이), 실제 언로드를 원할 경우 두 응용 프로그램에 모두 가입해야합니다. 또한 UnhandledException (.NET2.0 기준으로 항상 치명적입니다)이 다른 두 이벤트를 막을 수 있으므로 처리해야 할 세 번째 사례가 될 수 있습니다. 이 세 가지 이벤트는 모든 .NET 응용 프로그램에서 작동해야합니다.

ProcessExit의 실행 시간이 제한되어 있으므로 (약 4 초?)주의가 필요하므로 해당 이벤트 처리기에서 광범위한 "최종"작업을 수행하지 못할 수도 있습니다. 그것은 빨리 끝날 수 있어야합니다.

Application 이벤트는 WinForms 응용 프로그램에만 적용됩니다 (그러나이 응용 프로그램은 순수 WPF 응용 프로그램에는 적용되지 않을 수 있습니다). 이름 지정은 오해의 소지가 있습니다. 왜냐하면 이름이 특정 가정이있는 가장 기본적인 기본 용도로 명명되기 때문입니다. ThreadExit은 실제 System.Threading.Thread이 아니라 UI 스레드의 메시지 루프 (Application.Run())와 관련이 있으며, ApplicationExit은 하나 이상의 UI 스레드에서 응용 프로그램 양식 모음과 관련이 있습니다. 일반적으로 스레드의 입력 메소드에서 호출 된 Application.Run()에 대한 호출이 반환되면 입력 메소드가 빠르게 종료되고 스레드 자체가 종료됩니다. 일단 모든 UI 스레드가 종료되면 WinForms 응용 프로그램이 일반적으로 모두 완료되고 종료됩니다.

또 다른 이벤트는 System.Windows.Forms.Application.ThreadException 이벤트입니다. Windows 메시지 루프는 메시지를 처리 ​​할 때 발생하는 예외를 잡아 내고 잡히지 않고 (따라서 치명적인) 예외를 보내지 않고이 이벤트를 보내도록 구성 될 수 있습니다. 이러한 예외를 포착하면 메시지 루프 (및 해당 UI 스레드)가 (현재 메시지 처리기를 중단 한 후) 계속 실행될 수 있습니다. 주어진 스레드에 대해 언제든지이 이벤트에 가입자가 하나만있을 수 있습니다 (구독은 이전 구독자를 덮어 씁니다). 메시지 루프를 시작하기 전에 양식을 작성하고 구독하기 전에 구성해야합니다. 이 이벤트에 대한 MSDN 도움말 및 자세한 내용은 System.Windows.Forms.Applicaton.SetUnhandledExceptionMode()을 참조하십시오.

관련 문제