How to detect when application terminates?

前端 未结 5 793
我寻月下人不归
我寻月下人不归 2020-12-07 14:52

This is a follow up to my initial question and I would like to present my findings and ask for corrections, ideas and insights. My findings (or rather interpretations) come

相关标签:
5条回答
  • 2020-12-07 15:04

    You write:

    System.AppDomain.CurrentDomain.UnhandledException: (if handled in default AppDomain:) raised for any unhandled exception in any thread, no matter what AppDomain the thread started in. This means, this can be used as the catch-all for all unhandled exceptions.

    I do not think that this is correct. Try the following code:

    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);
                }
            }
        }
    }
    

    As far as I can tell, the UnhandledException handler is never called, and the thread will just silently crash (or nag at you if you run it in the debugger).

    0 讨论(0)
  • 2020-12-07 15:12

    Just add a new event on your main form:

    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.
    }
    
    0 讨论(0)
  • 2020-12-07 15:14
    1. The default timeout for a finalizer's execution is 2 seconds.
    0 讨论(0)
  • 2020-12-07 15:17

    Prompted by ssg31415926's question/answer (this question is a bit reversed), there's also Application.SessionEnding which is called when the when the user logs off or shuts down. It is called before the Exit event.

    0 讨论(0)
  • 2020-12-07 15:26

    When Dispatcher.BeginInvokeShutdown() is called, Application.Exit will not be called.

    0 讨论(0)
提交回复
热议问题