Web框架 --- .Net中的Worker Service

Web框架 --- .Net中的Worker Service

  • [IHostedService and BackgroundService](#IHostedService and BackgroundService)
    • [IHostedService 接口](#IHostedService 接口)
    • [BackgroundService 抽象类](#BackgroundService 抽象类)

IHostedService and BackgroundService

IHostedServiceBackgroundServiceASP.NET Core 中实现后台任务/长时间运行任务的两种主要方式

  • 关系图
text 复制代码
IHostedService (接口)
    ↑
BackgroundService (抽象类) ← 最常用
    ↑
YourBackgroundService (你的实现类)

IHostedService 接口

java 复制代码
public interface IHostedService
{
    // 服务启动时调用
    Task StartAsync(CancellationToken cancellationToken);
    
    // 服务停止时调用
    Task StopAsync(CancellationToken cancellationToken);
}

Example:

java 复制代码
public class MyHostedService : IHostedService
{
    private readonly ILogger<MyHostedService> _logger;
    private Timer? _timer;

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

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("后台服务启动");
        
        // 创建一个定时器
        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
        
        return Task.CompletedTask;
    }

    private void DoWork(object? state)
    {
        _logger.LogInformation($"执行后台任务,时间:{DateTime.Now}");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("后台服务停止");
        
        _timer?.Dispose();
        
        return Task.CompletedTask;
    }
}
  • 如果有多个hosted服务,则启动顺序和注册顺序一致
java 复制代码
// 注册服务并启动, Program.cs
builder.Services.AddHostedService<TimedHostedService>();

BackgroundService 抽象类

  • BackgroundService 是 .NET Core 3.0+ 引入的抽象基类,简化了 IHostedService 的实现。
  • 简化实现,只需重写 ExecuteAsync
java 复制代码
public abstract class BackgroundService : IHostedService, IDisposable
{
    protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
    
    public virtual Task StartAsync(CancellationToken cancellationToken);
    public virtual Task StopAsync(CancellationToken cancellationToken);
}

Example: 一个定时任务

java 复制代码
// 服务实现
public class TimedBackgroundService : BackgroundService
{
    private readonly PeriodicTimer _timer = new(TimeSpan.FromMinutes(5));
    private readonly ILogger<TimedBackgroundService> _logger;

    public TimedBackgroundService(ILogger<TimedBackgroundService> logger)
        => _logger = logger;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (await _timer.WaitForNextTickAsync(stoppingToken))
        {
            _logger.LogInformation("执行定时任务");
            // 执行具体业务逻辑
        }
    }
}

// 注册
builder.Services.AddHostedService<TimedBackgroundService>();
java 复制代码
// 注册
builder.Services.AddHostedService<TimedBackgroundService>();
相关推荐
驰骋工作流3 小时前
请假流程:六款.NET工作流引擎实现方式对比
.net·ccflow·工作流引擎二开·.net工作流引擎对比
WarPigs4 小时前
.NET项目app.Config笔记
c#·.net
海盗12341 天前
微软技术周报——2026-07-22
microsoft·c#·.net
海盗12341 天前
微软技术日报 ——2026-07-21
microsoft·c#·.net
半亩码田1 天前
【.NET新特性·第8篇】.NET 9 AI 构建基块:Microsoft.Extensions.AI
人工智能·microsoft·.net
Ctrl+Z侠2 天前
.NET WebApi Windows / Linux Docker 全链路压测与瓶颈定位 0 到 1 教程
linux·windows·.net
慧都小妮子2 天前
Aspose.CAD for .NET 26.6 更新发布
pdf·.net·3d渲染·cad·pdf导出·ifc编辑
夜莺悠吟2 天前
关于对 C# 中 ImplicitUsings,GlobalUsings 的讨论
c#·.net