응용 프로그램이 종료되는시기를 감지하는 방법은 무엇입니까?
이것은 제 초기 질문에 대한 후속 조치 이며 제 결과를 발표하고 수정, 아이디어 및 통찰력을 요청하고 싶습니다. 내 결과 (또는 오히려 해석)는 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 애플리케이션 : 단계적 종료
System.Windows.Application.Exit
System.AppDomain.CurrentDomain.ProcessExit
- 종료 자
WPF 애플리케이션 : 처리되지 않은 예외
System.AppDomain.CurrentDomain.UnhandledException
TestDriven.NET 내에서 실행중인 MbUnit : 테스트 통과 (단계적 종료)
System.AppDomain.CurrentDomain.DomainUnload
- 종료 자
TestDriven.NET 내에서 실행중인 MbUnit : 테스트 실패 (처리되지 않은 예외는 MbUnit에서 처리됨)
AppDomain.CurrentDomain.DomainUnload
- 종료 자
질문 :
- 내 해석 / 결과가 정확합니까?
- 내가 빠뜨린 자세한 내용을 알고 있습니까? 예를 들어 종료 자의 총 실행 시간은 얼마입니까?
- 내가 알고있는 다른 이벤트 / 아이디어가 있습니까?
- Windows Forms, 웹 서비스, ASP.NET 웹 사이트 등과 같은 다른 응용 프로그램에서는 어떤 이벤트가 있으며 어떤 순서로 발생합니까?
ssg31415926의 질문 / 답변 (이 질문은 약간 반대 임)에 따라 사용자가 로그 오프하거나 종료 할 때 호출되는 Application.SessionEnding 도 있습니다 . Exit 이벤트 전에 호출됩니다.
Dispatcher.BeginInvokeShutdown()
를 호출 하면 호출 Application.Exit
되지 않습니다.
- 종료 자의 실행에 대한 기본 제한 시간은 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
'programing' 카테고리의 다른 글
데이터를 CSV 플랫 파일로 내보내는 동안 포함 된 텍스트 한정자 문제를 해결하는 방법은 무엇입니까? (0) | 2020.12.02 |
---|---|
Concepts Lite를 사용하여 멤버 함수 템플릿이있는 유형에 대한 개념 지정 (0) | 2020.12.02 |
asp.net mvc 개발자를위한 자바 스크립트 모범 사례 (0) | 2020.12.02 |
RecyclerView에 스크롤 할 콘텐츠가 충분하지 않지만 AppBarLayout의 도구 모음을 스크롤 할 수 있습니다. (0) | 2020.12.02 |
기기의 시간 프로파일 러가 작동하지 않습니다. (0) | 2020.12.02 |