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>();
相关推荐
唐青枫1 天前
C#.NET Monitor 与 Mutex 深入解析:进程内同步、跨进程互斥与使用边界
c#·.net
会写代码的建筑师1 天前
.NET 控制台后台程序实践细节总结
后端·.net
阿捞21 天前
在 .NET 中使用 Moonshot Kimi + AgentFramework:从 SDK 到 Agent 的完整实践
html·.net·xhtml
步步为营DotNet1 天前
解锁.NET 11 中 Microsoft.Extensions.AI 在智能后端开发的深度应用
人工智能·microsoft·.net
无风听海1 天前
.NET10之C# 中的is null深入理解
服务器·c#·.net
bjzhang751 天前
FastReport——一个面向.NET生态的开源报表引擎
.net·fastreport
武藤一雄2 天前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
步步为营DotNet2 天前
剖析.NET 11 中 Native AOT 在高性能客户端应用的极致实践
.net
步步为营DotNet2 天前
深度探索.NET Aspire在云原生应用性能与安全加固的创新实践
安全·云原生·.net
我是唐青枫2 天前
C#.NET TPL Dataflow 深入解析:数据流管道、背压控制与实战取舍
c#·.net