我在 .net 通用主机中托管了一个 BackgroundService,如下所示:
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");
}
}
在正在运行的应用程序的 Windows 终端上的 ctrl+c 上它说Application is shutting down
(这是来自框架)但是停止令牌永远不会被设置(所以我不能关闭我的工作人员)。
stopToken 如何以及何时设置,我如何优雅地终止我的工作人员?
控制台