У меня есть BackgroundService, размещенный на хосте. net generi c host следующим образом:
var builder = Host.CreateDefaultBuilder(args);
builder
.ConfigureLogging((hostingContext, logging) =>
{
logging.ClearProviders();
logging.AddConsole();
if(hostingContext.HostingEnvironment.IsDevelopment() == true)
logging.AddDebug();
})
.ConfigureHostConfiguration(configurationBuilder =>
{
configurationBuilder.AddCommandLine(args);
})
.ConfigureAppConfiguration((hostingContext, configApp) =>
{
var env = hostingContext.HostingEnvironment;
Console.WriteLine(env.EnvironmentName);
})
.UseConsoleLifetime();
У меня есть рабочий:
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// here i am doing something with ClientWebSocket, threads etc
// snipped for brevity. I want to avoid spinning in a loop
// the debugger reaches the following line
WaitHandle.WaitAny(new[] { stoppingToken.WaitHandle });
// but never hits this line
this.logger.LogInformation("shutting down worker");
}
}
На Ctrl + c из терминала windows запущенного приложения выдается Application is shutting down
(это из фреймворка), однако stoppingToken никогда не устанавливается (поэтому я не могу выключить моего работника).
Как и когда устанавливается stoppingToken , и как я могу изящно прекратить мой работник?
Консоль