Подводя итог разговора ниже исходного вопроса.
Похоже, что IHostedService
используется в HostBuilder
, это то, что контролирует SIGTERM
. Как только Task
помечен как завершенный, он определяет, что служба корректно завершила работу. Перемещая System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 2");
и код в блоке finally внутри области службы, это можно было исправить. Измененный код предоставлен ниже.
public static async Task Main(string[] args)
{
Console.WriteLine("Starting");
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<DaemonService>();
});
System.IO.File.WriteAllText("/path-to-app/_main.txt", "Line 1");
await host.RunConsoleAsync();
}
public class DaemonService : IHostedService, IDisposable
{
public Task StartAsync(CancellationToken cancellationToken)
{
System.IO.File.WriteAllText("/path-to-app/_Start.txt", "Line 1");
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
public void Dispose()
{
try
{
System.IO.File.WriteAllText("/path-to-app/_Dispose.txt", "Line 1");
System.IO.File.WriteAllText("/path-to-app/_Stop.txt", "Line 1");
}
finally
{
System.IO.File.WriteAllText("/path-to-app/_main-finally.txt", "Line 1");
}
}
}
Поскольку это работает как служба, мы пришли к выводу, что на самом деле имеет смысл содержать завершение самой службы в этой области, аналогично тому, как работают приложения ASP.NET Core, предоставляя только службу внутри Program.cs
файл и позволяет самой службе поддерживать свои зависимости.
Я бы посоветовал содержать как можно больше в сервисе и просто запустить метод Main
.