2011-01-10 4 views
55

Я ищу способ запуска куска кода при закрытии консольного приложения (пользователи закрывают окно). Пробовал с:«На выходе» для консольного приложения

AppDomain.CurrentDomain.ProcessExit += 
    new EventHandler(CurrentDomain_ProcessExit); 

но выше не работает, если закрыт вручную.

Есть ли способ использовать .Net-вызов для этого или мне нужно импортировать dll ядра и сделать это таким образом?

+2

У вас есть «ручное закрытие» означает, что пользователь нажимает на крест «закрыть окно» в правом верхнем углу окна консоли? –

+0

Я подозреваю, что за вами стоит «On Exit» самой командной строки. Как только будет выполнен «основной» метод консольного приложения, он вышел из-под вас, и пользователю нужно нажать клавишу Enter, чтобы закрыть окно командной строки. –

+0

@Martin. Да, вот что я имел в виду. Будет обновляться для уточнения. – BlueVoodoo

ответ

25

Вам нужно подключить консольное событие выхода, а не ваш процесс.

http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx

Capture console exit C#

+0

Первая ссылка от geekswithblogs не работает на 100%, как вы можете читать в комментариях к блогу, а вторая ссылка также не отвечает на проблему с победой 7 – SeeuD1

92

Этот код работает, чтобы поймать пользователя закрытия окна консоли:

using System; 
using System.Runtime.InteropServices; 

class Program { 
    static void Main(string[] args) { 
     handler = new ConsoleEventDelegate(ConsoleEventCallback); 
     SetConsoleCtrlHandler(handler, true); 
     Console.ReadLine(); 
    } 

    static bool ConsoleEventCallback(int eventType) { 
     if (eventType == 2) { 
      Console.WriteLine("Console window closing, death imminent"); 
     } 
     return false; 
    } 
    static ConsoleEventDelegate handler; // Keeps it from getting garbage collected 
    // Pinvoke 
    private delegate bool ConsoleEventDelegate(int eventType); 
    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add); 

} 

Берегись ограничений. У вас есть, чтобы быстро ответить на это уведомление, у вас есть 5 секунд, чтобы выполнить задачу. Возьмите больше времени, и Windows будет убивать ваш код бесцеремонно. И ваш метод называется асинхронно на рабочем потоке, состояние программы совершенно непредсказуемо, поэтому, вероятно, потребуется блокировка. Убедитесь, что прерывание не может вызвать проблемы. Например, при сохранении состояния в файл сначала сделайте сначала сохранение во временном файле и используйте File.Replace().

+0

Это очень полезно знать. Возможно, придется обойти это. Спасибо за ваш ответ. Наверх ваш ответ +1. – BlueVoodoo

+3

Отлично работает! Если кто-то заинтересован в других возможных типах событий: http://msdn.microsoft.com/en-us/library/ms683242%28v=vs.85%29.aspx –

+0

сохранение во временном файле - это очень хороший совет. это не только безопасно закрывает приложение, но и систему. это так просто. только то, что я искал +1 – symbiont

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