2024-08-12 · C# 基础 · 学习笔记

BackgroundService 后台服务

BackgroundService 是 .NET Core 写后台任务的基类,适合做定时任务、后台 worker。用 PeriodicTimer 做定时循环,比 Thread.Sleep 优雅,能响应取消。

自己写定时清理任务就是用这个模式。关键是 ExecuteAsync 要支持 CancellationToken,服务停止时能优雅退出。

注意事项:1) 在 Program.cs 里 AddHostedService<T>() 注册;2) 长时间操作要传 CancellationToken;3) 不要在构造函数里做耗时操作。

代码示例

public class CleanupJob : BackgroundService
{
    private readonly ILogger<CleanupJob> _logger;

    public CleanupJob(ILogger<CleanupJob> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        using var timer = new PeriodicTimer(TimeSpan.FromMinutes(5));

        while (await timer.WaitForNextTickAsync(stoppingToken))
        {
            try
            {
                _logger.LogInformation("开始清理过期数据");
                // 清理逻辑...
                await Task.Delay(1000, stoppingToken); // 模拟工作
                _logger.LogInformation("清理完成");
            }
            catch (OperationCanceledException) { throw; }
            catch (Exception ex)
            {
                _logger.LogError(ex, "清理失败");
            }
        }
    }
}

// Program.cs 注册
builder.Services.AddHostedService<CleanupJob>();
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。