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>();
相关推荐
微小冷5 小时前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
唐青枫10 小时前
别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解
c#·.net
rockey6271 天前
基于AScript的Lua脚本语言发布啦
c#·.net·lua·script·动态脚本
半亩码田1 天前
【.NET新特性·第11篇】C# 14 字段属性:告别手写 backing field
java·c#·.net
唐青枫1 天前
别再把命令行参数写成一团:C#.NET System.CommandLine 实战详解
c#·.net
hez20101 天前
让 .NET 11 的泛型虚方法变得更快!
c#·.net·.net core·clr·compiler
宝桥南山1 天前
Microsoft Agent Framework(.NET) - 尝试一下从MCP Server上获取Agent Skills
ai·微软·c#·aigc·.net·.netcore
海盗12342 天前
微软技术日报·2026-08-12——Windows 11多通道累积更新推送十余项功能改进;.NET WebSocket DoS紧急修复
windows·microsoft·.net
唐青枫3 天前
别再手写 args[0]:C#.NET CommandLineParser 命令行工具实战详解
c#·.net
.Peter3 天前
.NET/WPF 程序在部分 Windows 电脑无法保存用户环境变量:使用 DPAPI 实现安全兼容
windows·信息安全·c#·.net·wpf·环境变量·dpapi