programing

응용 프로그램이 종료되는시기를 감지하는 방법은 무엇입니까?

nasanasas 2020. 12. 2. 21:26
반응형

응용 프로그램이 종료되는시기를 감지하는 방법은 무엇입니까?


이것은 제 초기 질문에 대한 후속 조치 이며 제 결과를 발표하고 수정, 아이디어 및 통찰력을 요청하고 싶습니다. 내 결과 (또는 오히려 해석)는 MSDN .NET 3.5 설명서를 읽고 .NET 3.5 코드를 디버깅하는 이전 질문에 대한 사람들의 답변에서 나왔습니다. 저처럼 응용 프로그램이 종료되는시기를 감지하는 방법을 궁금해하는 사람에게 이것이 가치가 있기를 바랍니다.

이벤트 :

  • System.AppDomain.CurrentDomain.ProcessExit: 프로세스가 종료 될 때 발생합니다. 예를 들어 기본값 AppDomain및 다른 모든 항목이 언로드 된 후 [총 실행 시간은 3 초로 제한됩니다!]. WPF의 경우 System.Windows.Application.Exit대신 사용하십시오. Windows Forms의 경우 Application.Run(...)main 메서드에서 코드를 실행합니다 .

  • System.AppDomain.CurrentDomain.DomainUnload: 예를 들어 단위 테스트 프레임 워크 (TestDriven.NET을 사용하는 MbUnit)를 사용하여 클래스를 실행할 때 AppDomain기본이 아닌 다른 파일이 AppDomain언로드 될 때 발생합니다.

  • System.AppDomain.CurrentDomain.UnhandledException: (기본값으로 처리되는 경우 AppDomain:) AppDomain스레드가 시작된 위치에 관계없이 모든 스레드에서 처리되지 않은 예외에 대해 발생합니다 . 즉, 처리되지 않은 모든 예외에 대한 포괄로 사용할 수 있습니다.

  • System.Windows.Application.Exit: WPF 응용 프로그램 (즉, 기본값 AppDomain)이 정상적으로 종료 될 때 발생 합니다. System.Windows.Application.OnExit그것을 활용 하려면 재정의 하십시오.

  • 종료 자 (C #의 소멸자) : 가비지 수집기가 관리되지 않는 리소스를 해제 할 때 실행됩니다. [총 실행 시간이 제한되어 있습니다!].

이벤트 순서 :

WPF 애플리케이션 : 단계적 종료

  1. System.Windows.Application.Exit
  2. System.AppDomain.CurrentDomain.ProcessExit
  3. 종료 자

WPF 애플리케이션 : 처리되지 않은 예외

  1. System.AppDomain.CurrentDomain.UnhandledException

TestDriven.NET 내에서 실행중인 MbUnit : 테스트 통과 (단계적 종료)

  1. System.AppDomain.CurrentDomain.DomainUnload
  2. 종료 자

TestDriven.NET 내에서 실행중인 MbUnit : 테스트 실패 (처리되지 않은 예외는 MbUnit에서 처리됨)

  1. AppDomain.CurrentDomain.DomainUnload
  2. 종료 자

질문 :

  • 내 해석 / 결과가 정확합니까?
  • 내가 빠뜨린 자세한 내용을 알고 있습니까? 예를 들어 종료 자의 총 실행 시간은 얼마입니까?
  • 내가 알고있는 다른 이벤트 / 아이디어가 있습니까?
  • Windows Forms, 웹 서비스, ASP.NET 웹 사이트 등과 같은 다른 응용 프로그램에서는 어떤 이벤트가 있으며 어떤 순서로 발생합니까?

ssg31415926의 질문 / 답변 (이 질문은 약간 반대 임)에 따라 사용자가 로그 오프하거나 종료 할 때 호출되는 Application.SessionEnding 도 있습니다 . Exit 이벤트 전에 호출됩니다.


Dispatcher.BeginInvokeShutdown()를 호출 하면 호출 Application.Exit되지 않습니다.


  1. 종료 자의 실행에 대한 기본 제한 시간은 2 초입니다.

당신은 쓰기:

System.AppDomain.CurrentDomain.UnhandledException : (기본 AppDomain :에서 처리되는 경우) 스레드가 시작된 AppDomain에 관계없이 모든 스레드에서 처리되지 않은 예외에 대해 발생합니다. 즉, 처리되지 않은 모든 예외에 대한 포괄로 사용할 수 있습니다. .

나는 이것이 옳다고 생각하지 않는다. 다음 코드를 시도하십시오.

using System;
using System.Threading;
using System.Threading.Tasks;

namespace AppDomainTestingUnhandledException
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.UnhandledException +=
                (sender, eventArgs) => Console.WriteLine("Something went wrong! " + args);

            var ad = AppDomain.CreateDomain("Test");

            var service =
                (RunInAnotherDomain)
                ad.CreateInstanceAndUnwrap(
                    typeof(RunInAnotherDomain).Assembly.FullName, typeof(RunInAnotherDomain).FullName);

            try
            {
                service.Start();
            }
            catch (Exception e)
            {
                Console.WriteLine("Crash: " + e.Message);
            }
            finally
            {
                AppDomain.Unload(ad);
            }
        }
    }

    class RunInAnotherDomain : MarshalByRefObject
    {
        public void Start()
        {
            Task.Run(
                () =>
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine("Uh oh!");
                        throw new Exception("Oh no!");
                    });

            while (true)
            {
                Console.WriteLine("Still running!");
                Thread.Sleep(300);
            }
        }
    }
}

내가 알 수있는 한 UnhandledException 핸들러는 호출되지 않으며 스레드는 조용히 충돌합니다 (또는 디버거에서 실행하는 경우 사용자에게 잔소리를 함).


기본 양식에 새 이벤트를 추가하기 만하면됩니다.

private void frmMain_Load(object sender, EventArgs e)
{
  Application.ApplicationExit += new EventHandler(this.WhenItStopsDoThis);
}

private void WhenItStopsDoThis(object sender, EventArgs e)
{
  //Program ended. Do something here.
}

참고 URL : https://stackoverflow.com/questions/1372123/how-to-detect-when-application-terminates

반응형