Приложение не входит в обработчик сигналов Posix в режиме выпускаC#

Место общения программистов C#
Anonymous
Приложение не входит в обработчик сигналов Posix в режиме выпуска

Сообщение Anonymous »

Я пытаюсь корректно завершить работу консольного приложения на устройстве с ОС Linux. Отправляемый сигнал — SIGTERM. Я реализовал обработчик сигналов Posix с помощью нового метода PosixSignalRegistration.Create(). Это отлично работает при компиляции в режиме отладки. Однако в режиме выпуска (с включенной оптимизацией) обработчик никогда не вводится.
Вот MRE:

Код: Выделить всё

using Microsoft.Extensions.Hosting;
using System.Runtime.InteropServices;

ManualResetEvent resetEvent = new(false);
CancellationTokenSource cts = new();

// Handles CTRL + C in both operating systems
Console.CancelKeyPress += (sender, eventArgs) =>
{
Console.WriteLine("Received CTRL+C");
resetEvent.Set();
eventArgs.Cancel = true;
cts.Cancel();
};

// Handles graceful kill (Sigterm) in linux (e.g. systemctl stop)
PosixSignalRegistration.Create(PosixSignal.SIGTERM, (context) =>
{
Console.WriteLine("Received SIGTERM");
resetEvent.Set();
cts.Cancel();
});

IHost? host = null;

try
{
var hostBuilder = Host.CreateDefaultBuilder(args);
host = hostBuilder.Build();

host.Start();

resetEvent.Reset();
resetEvent.WaitOne();
}
catch
{
Console.WriteLine("Error");
}
finally
{
Console.WriteLine("finally");
await (host?.StopAsync(TimeSpan.FromSeconds(5)) ?? Task.CompletedTask);
Console.WriteLine("Application shut down");
}
В режиме отладки при вызове pkill my-application -15 журнал выглядит следующим образом, и приложение закрывается:

Код: Выделить всё

Received SIGTERM
finally
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
Application shut down
В режиме выпуска единственное, что происходит, это следующее сообщение журнала:

Код: Выделить всё

info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
Однако приложение продолжает работать, и его можно корректно закрыть только с помощью Ctrl + C или pkill my-application -2.
Чего мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/744 ... lease-mode

Вернуться в «C#»