2015-12-29 4 views
3

У нас есть консольное приложение: Как обрабатывать закрытие консольного приложения

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 ManagerClose() метод вообще не называется.

Вопросов:

  1. Почему finally блок не работает?
  2. Как справиться с закрытием консоли на Close button? деструктор

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

деструктор не вызывается!

+0

Пожалуйста, обратитесь к http://blogs.msdn.com/b/jmstall/archive/2006/11/26/process-exit-event.aspx – Zen

ответ

1
  1. Окончательно блок достигается только тогда, когда Console.ReadLine() вызов завершен, который происходит только при нажатии клавиши ввода на клавиатуре. Другого способа достичь кода в блоке finally нет.

  2. Для обработки close button вам необходимо подписаться на событие Win32, так как .NET не предоставляет для него прямых привязок. Пожалуйста, смотрите предложения в этом вопросе: Capture console exit C#

Смежные вопросы