.NET 7 BackgroundService如何实现停止时日志记录?
解决.NET 7 BackgroundService无法记录停止日志的问题
你在使用.NET 7实现BackgroundService时,无法记录服务停止的日志,尝试了四种写法都未成功。核心原因是当服务停止时,stoppingToken触发取消,Task.Delay会抛出OperationCanceledException,导致ExecuteAsync中循环后的代码无法执行;直接重写StopAsync时,也可能因程序终止过快导致日志未输出。
正确实现方式
结合捕获取消异常和重写StopAsync,确保停止日志能稳定输出:
public class BackgroundWorkerService : BackgroundService { readonly ILogger<BackgroundWorkerService> _logger; public BackgroundWorkerService(ILogger<BackgroundWorkerService> logger) { _logger = logger; } protected async override Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Service Started"); try { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Service running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } catch (OperationCanceledException) { // 捕获取消异常,记录停止过渡日志 _logger.LogInformation("Service is stopping..."); } } public override async Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("Service Stopped"); await base.StopAsync(cancellationToken); } }
关键说明
- 在
ExecuteAsync中用try-catch捕获OperationCanceledException:当服务发起停止请求时,Task.Delay会因取消令牌触发抛出该异常,捕获后可记录停止前的过渡状态。 - 重写
StopAsync方法:这是BackgroundService生命周期中明确的停止回调,在此处记录最终停止日志,能确保服务停止逻辑执行时一定会触发日志输出。 - 避免依赖循环后的代码:取消异常会打断代码执行流程,循环后的代码大概率不会被执行到。
内容的提问来源于stack exchange,提问作者Abhay Singh
相关产品推荐
相关产品推荐

