Как заставить CancellationToken запускаться в Docker Container SIGTERM?C#

Место общения программистов C#
Ответить
Anonymous
 Как заставить CancellationToken запускаться в Docker Container SIGTERM?

Сообщение Anonymous »

В C# .NET 8 у меня есть...

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

var builder = WebApplication.CreateBuilder(args);

builder
.RegisterSharedServices()
.Services
.AddSingleton();

// Add Controllers
builder
.AddCoreApiSupport() // that's custom
. ...();

// Host
builder
.Services
.AddHostedService();

var webApp = builder.Build();

...

webApp.SetupApiSupport();

await webApp.RunAsync();
тип проекта —
.
По сути, я запуск реализации BackgroundService с поддержкой API поверх нее в контейнере Docker Linux.
Я хочу захватывать и обрабатывать сигнал SIGTERM с помощью средства CancellationToken, который распространяется повсюду. Его «точка входа» находится здесь, в реализации класса, производного от BackgroundService:

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

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
Меня сбивает с толку то, что StopToken никогда не срабатывает (т.е. Task.Delay(...), например, не генерирует исключение. Кажется, как будто сигнал полностью игнорируется, когда я выключаю контейнер из Docker Desktop, я читал что-то о необходимости RunConsoleAsync и пожизненной поддержки консоли, что для меня не имеет особого смысла. .
Мой вопрос: что мне нужно изменить, чтобы мой CancellationToken срабатывал при закрытии Docker-контейнера?
Я тоже это пробовал:

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

appLifetime.ApplicationStopping.Register(() =>
{
Console.WriteLine("Stopping!");
});
что бы это ни стоило, мне никогда не удается выполнить Console.WriteLine(...). Не знаю, что это значит, это похоже на то, что событие ApplicationStopping никогда не срабатывает.

Подробнее здесь: https://stackoverflow.com/questions/793 ... er-sigterm
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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