"On Exit" для консольного приложения [дубликат]
этот вопрос уже есть ответ здесь:
- захват консоли выход C# 10 ответов
Я ищу способ вызвать фрагмент кода, когда консольное приложение закрывается вручную (пользователи закрывают окно). Пробовал с:
AppDomain.CurrentDomain.ProcessExit +=
new EventHandler(CurrentDomain_ProcessExit);
но выше не работает, если вручную закрытый.
есть ли способы использовать .Net-вызов для этого или мне нужно импортировать dll ядра и сделать это таким образом?
2 ответа:
вам нужно подключить к консоли событие и процесс.
http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx
этот код работает, чтобы поймать пользователя, закрывающего окно консоли:
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 убьет ваш код бесцеремонно. И ваш метод вызывается асинхронно в рабочем потоке, состояние программы полностью непредсказуемо, поэтому, вероятно, потребуется блокировка. Убедитесь абсолютно, что прерывание не может вызвать проблемы. Например, при сохранении состояния в файл убедитесь, что вы сначала сохраните его во временный файл и используете файл.Заменять.)(