"On Exit" для консольного приложения [дубликат]


этот вопрос уже есть ответ здесь:

Я ищу способ вызвать фрагмент кода, когда консольное приложение закрывается вручную (пользователи закрывают окно). Пробовал с:

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

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

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

2 59

2 ответа:

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

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

захват консоли выход C#

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

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 убьет ваш код бесцеремонно. И ваш метод вызывается асинхронно в рабочем потоке, состояние программы полностью непредсказуемо, поэтому, вероятно, потребуется блокировка. Убедитесь абсолютно, что прерывание не может вызвать проблемы. Например, при сохранении состояния в файл убедитесь, что вы сначала сохраните его во временный файл и используете файл.Заменять.)(