우리는 마침내 이것에 대해 더 많은 것을 발견했습니다 (하지만 내 컴퓨터가 다시 작성되어 내 등록되지 않은 프로필의 쿠키를 잃어 버렸습니다. 잘하면이 답변을 게시 할 예정입니다).
추가 조사는 결국 몇 가지 더 우리가 도움이 발견 이벤트 발견 :
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()
을 참조하십시오.