我已经阅读了大部分关于IHostApplicationLifetime和CancellationToken在.NET Core 3.1中的文章,但我找不到为什么这不起作用的原因。
我有一个简单的BackgroundService,如下所示:
public class AnotherWorker : BackgroundService
{
private readonly IHostApplicationLifetime _hostApplicationLifetime;
public AnotherWorker(IHostApplicationLifetime hostApplicationLifetime)
{
_hostApplicationLifetime = hostApplicationLifetime;
}
public override Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine($"Process id: {Process.GetCurrentProcess().Id}");
_hostApplicationLifetime.ApplicationStarted.Register(() => Console.WriteLine("Started"));
_hostApplicationLifetime.ApplicationStopping.Register(() => Console.WriteLine("Stopping"));
_hostApplicationLifetime.ApplicationStopped.Register(() => Console.WriteLine("Stopped"));
return Task.CompletedTask;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
Console.WriteLine("Executing");
return Task.CompletedTask;
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
// This actually prints "Stop. IsCancellationRequested: False". Why?
Console.WriteLine($"Stop. IsCancellationRequested: {cancellationToken.IsCancellationRequested}");
await base.StopAsync(cancellationToken);
}
}
默认情况下,会添加ConsoleLifetime,它会监听Ctrl+C和SIGTERM,并通知IHostApplicationLifetime。我猜IHostApplicationLifetime应该取消所有的CancellationTokens?这是一篇关于此主题的好文章。那么为什么上面代码片段的输出结果会是以下内容?
Hosting starting
Started
Hosting started
(sends SIGTERM with `kill -s TERM <process_id>`)
Applicationis shuting down...
Stop. IsCancellationRequested: False
Stopped
Hosting stopped
我希望它记录“Stop. IsCancellationRequested: True”。
我希望能够将此令牌传递给其他服务调用,以使它们具有优雅关闭的能力。
IsCancellationRequested
与相同令牌中的不同。为了优雅地关闭,您需要在ExecuteAsync
上执行该操作。当您在那里有一个长时间运行的任务并检查IsCancellationRequested
时,它将为真。CloseAsync
只是用于清理一些数据,而不是用于优雅地关闭。传递到ExecuteAsync
的令牌与CloseAsync
不同。 - CodeNotFound