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>();
相关推荐
我是唐青枫11 小时前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
开发语言·c#·.net
步步为营DotNet14 小时前
深入.NET 11:.NET Aspire 在云原生资源编排与管理的卓越实践
云原生·.net
一个帅气昵称啊15 小时前
基于.NET的NetCoreKevin框架中AgentFramework实现AI智能体Skill和工具动态管理和加载
.net
魏杨杨1 天前
一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG...
ai·.net·agent·claude code
AI行业学习1 天前
.NET Framework 3.5 官方离线包下载+完整安装教程【2026.5.19】
.net
切糕师学AI1 天前
.NET 中 CallerMemberName 与 StackTrace 的深度对比
.net·调用栈·stacktrace·callermember
步步为营DotNet2 天前
解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践
微服务·asp.net·.net
唐青枫2 天前
C#.NET YARP + OpenTelemetry:网关链路追踪实战
c#·.net
rockey6272 天前
AScript异步执行与await关键字
c#·.net·script·eval·expression·异步执行·动态脚本
叫我少年2 天前
ASP.NET Core 最小 API 快速参考
.net·api