You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:47:30