如何处理控制台应用程序关闭

时间:2015-12-29 08:33:39

标签: c# console-application

我们有控制台应用程序:

namespace MyApplication
{

    public void Main()
    {
        try
        {
            AppDomain.CurrentDomain.ProcessExit  += (sender, eventArgs) => Stop();

            Start();
            Console.ReadLine();
        }
        finally
        {
            Close();
        }
    }

    public void Start() 
    {
        //...
    }

    public void Stop() 
    {
        //...
    }
}

因此,如果应用程序已正确停止(通过在控制台窗口中按Enter),则会从Close()&中调用finally方法。 AppDomain.CurrentDomain.ProcessExit

但是当应用程序被Close button关闭或被Task Manager Close()终止时,方法根本不会被调用。

问题是:

  1. 为什么finally阻止不起作用?
  2. 如何按Close button处理控制台关闭?
  3. UPD 即使是对象的析构函数也没有被调用:

    public class Watcher
    {
        Action _start;
        Action _stop;
        public Watcher(Action start, Action stop)
        {
            _start = start;
            _stop = stop;
        }
    
        ~Watcher()
        {
            _stop();
        }
    
        public void Start()
        {
            _start();
        }
    }
    
    // And using as:
    var w = new Watcher(Start, Stop);
    w.Start();
    

    不会调用析构函数!

1 个答案:

答案 0 :(得分:1)

  1. 仅在完成Console.ReadLine()呼叫时才会到达finally块,只有当您按下键盘上的Enter键时才会发生此呼叫。没有其他方法可以访问finally块中的代码。

  2. 要处理close button,您需要订阅Win32事件,因为.NET不为它提供直接绑定。请参阅此问题中的建议:Capture console exit C#