如何在应用程序终止检测?(How to detect when application termin

2019-07-04 13:38发布

这是一个后续行动,我最初的问题 ,我想提出我的调查结果,并要求更正,想法和见解。 我的发现(或者说解释)来自别人的答案我刚才的问题,阅读MSDN .NET 3.5的文档和调试.NET 3.5的代码。 我希望这将是有价值的人谁不知道像我这样怎么当一个应用程序终止检测。

事件:

  • System.AppDomain.CurrentDomain.ProcessExit :当进程退出,例如默认后引发AppDomain和一切被卸载[总执行时间被限制到只有3秒!]。 对于WPF,使用System.Windows.Application.Exit代替。 对于Windows窗体,之后运行代码Application.Run(...)的主要方法。

  • System.AppDomain.CurrentDomain.DomainUnload :提出当AppDomain为非默认AppDomain与单元测试框架(MbUnit的与TestDriven.NET)上运行的类时卸载,例如。

  • 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

MbUnit的运行里面TestDriven.NET:通过测试(正常退出)

  1. System.AppDomain.CurrentDomain.DomainUnload
  2. 终结

MbUnit的运行里面TestDriven.NET:失败的测试(未处理的异常是由MbUnit的处理)

  1. AppDomain.CurrentDomain.DomainUnload
  2. 终结

问题:

  • 是我的解释/结果是否正确?
  • 你知道的,我已经离开了更多的细节? 例如,什么是总执行时间终结?
  • 你知道的任何其他事件/想法,我知道的?
  • 什么事件有什么为了他们得到成长于其他应用程序,如Windows窗体,Web服务,ASP.NET网站,等等?

Answer 1:

通过ssg31415926的提问/回答提示(这个问题是对调了一下),也就是Application.SessionEnding的当用户注销或关闭时被调用。 它的退出事件之前调用。



Answer 2:

Dispatcher.BeginInvokeShutdown()被调用时, Application.Exit不会被调用。



Answer 3:

  1. 为终结的执行默认的超时时间为2秒。


Answer 4:

你写:

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处理程序不被调用,该线程将只是默默崩溃(或你唠叨,如果你在调试器中运行)。



Answer 5:

只是你的主窗体上添加一个新的事件:

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.
}


文章来源: How to detect when application terminates?