Я создал рабочий сервис, унаследованный от Microsoft.Extensions.Hosting.BackgroundService, который я затем развернул в докерном контейнере Linux на моем компьютере с помощью отладчика Visual Studio. Я ставлю точку останова на код, который происходит, когда cancellationtoken.IsCancellationRequested имеет значение true. Затем я запускаю «docker stop --time = 30» для контейнера, точка останова никогда не срабатывает, и через 30 секунд отладчик принудительно останавливается.
Я также попытался переопределить метод StopAsync и установить там точку останова, которая также не вызывается. Я использую .net core 3, последнюю версию рабочего стола Docker. Я подтвердил, что StartAsync вызывается.
Это мой программный файл.
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
.AddEnvironmentVariables().Build();
})
.ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); });
}
Если у кого-то есть идея о том, что я пропустил, или рабочий пример службы без веб-сервера, которая уважает остановку, я был бы очень признателен.
Добавление того, как выглядит мой работник:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace MyWorker
{
public class Worker : BackgroundService
{
public Worker(ILogger<Worker> logger, IConfiguration configs)
{
}
public override Task StopAsync(CancellationToken cancellationToken)
{
return base.StopAsync(cancellationToken);
}
public override Task StartAsync(CancellationToken cancellationToken)
{
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
try
{
await DoWork(cancellationToken); //While loop that checks token in here
}
catch (Exception ex)
{
throw;
}
}
}
}