Я создал ConsoleEventHandler на основе следующей описанной ссылки: https://www.meziantou.net/detecting-console-closing-in-dotnet.htm
У меня он отлично работает. В настоящее время я использую sh, он может обрабатывать SIGTERM как от Windows, так и Linux. Кто-нибудь знает, как его оптимизировать в C#? Следующий код необходимо оптимизировать в двух частях:
- может загружать Kernel32 в docker. В настоящее время он не работает в «System.DllNotFoundException: невозможно загрузить общую библиотеку Kernel32 или одну из ее зависимостей».
- Поддержка linux система;
Исходный код:
class Program
{
// https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms686016.aspx
[DllImport("Kernel32")]
private static extern bool SetConsoleCtrlHandler(SetConsoleCtrlEventHandler handler, bool add);
// https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms683242.aspx
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;
}
}
}