По какой-то причине я рассматриваю веб-приложение .NET 8 как приложение для Windows, публикую его с использованием автономного метода и выполняю.
Но я хочу знать, как зафиксировать событие, когда пользователь закрывает программу с помощью значка на панели инструментов Windows или в правом верхнем углу окна.
В настоящее время я пытаюсь использовать app.Lifetime.ApplicationStopping
, но, похоже, он фиксирует только завершение, вызванное нажатием Ctrl+C
в консоли, и не может обнаружить закрытие, вызванное щелчком по значку или верхнему правому углу окна.
Фактически, моя конечная цель — выполнить какие-то действия, когда тот или иной сервис заканчивается. Это еще одна DLL .NET 8, но ее деструкторы, похоже, тоже не срабатывают.
Поэтому, если есть лучший способ добиться этого, предложите его. Спасибо.
Обновлять:
Когда я использую AppDomain.CurrentDomain.ProcessExit
, я могу это поймать. Однако в этот момент объект стал нулевым, что затрудняет манипулирование им.
Вы можете просмотреть этот фрагмент, но лучше использовать службу Windows и обнаружить StopAsync
class Program
{
// https://learn.microsoft.com/en-us/windows/console/setconsolectrlhandler?WT.mc_id=DT-MVP-5003978
[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(SetConsoleCtrlEventHandler handler, bool add);
// https://learn.microsoft.com/en-us/windows/console/handlerroutine?WT.mc_id=DT-MVP-5003978
private delegate bool SetConsoleCtrlEventHandler(CtrlType sig);
private enum CtrlType
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}
static void Main(string[] args)
{
// Register the handler
SetConsoleCtrlHandler(Handler, true);
// Wait for the event
while (true)
{
Thread.Sleep(50);
}
}
private static bool Handler(CtrlType signal)
{
switch (signal)
{
case CtrlType.CTRL_BREAK_EVENT:
case CtrlType.CTRL_C_EVENT:
case CtrlType.CTRL_LOGOFF_EVENT:
case CtrlType.CTRL_SHUTDOWN_EVENT:
case CtrlType.CTRL_CLOSE_EVENT:
Console.WriteLine("Closing");
// TODO Cleanup resources
Environment.Exit(0);
return false;
default:
return false;
}
}
}
Эквивалентны ли эти сигналы ProcessExit?
Сигналом срабатывания является CtrlType.CTRL_CLOSE_EVENT при нажатии правой кнопки закрытия.
Спасибо, я объединил этот подход с событием ProcessExit для достижения моего требования.
Обычно лучше, если это возможно, реструктурировать события «окончания жизни» в события «начала жизни». Это делает ваш код более надежным перед лицом непреодолимых последствий, таких как внезапное отключение электроэнергии или системный администратор, убивающий ваш процесс.