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>();
相关推荐
用户4488466710608 小时前
.NET 进阶 —— 深入理解线程(3)ThreadPool 与 Task 入门:从手动线程到池化任务的升级
c#·.net
步步为营DotNet10 小时前
深度解析.NET中属性(Property)的幕后机制:优化数据访问与封装
java·算法·.net
Crazy Struggle11 小时前
一款轻量级 WinForm 开源控件库,让老界面秒变高颜值
.net·winform·ui控件库
缺点内向13 小时前
C#:轻松实现Excel到TXT的转换
后端·c#·.net·excel
bugcome_com13 小时前
深入浅出 C# 中的 static 关键字——理解静态与实例的核心差异
c#·.net
csdn_aspnet13 小时前
升级到 .NET 10 时需要注意的重大变更
.net·.net 10
唐青枫14 小时前
一篇搞定 dotnet ef:EF Core 常用命令与实战指南
c#·.net
bugcome_com1 天前
深入理解 C# 中 new 关键字的三重核心语义
c#·.net