Web框架 --- .Net中的Worker Service
- [IHostedService and BackgroundService](#IHostedService and BackgroundService)
-
- [IHostedService 接口](#IHostedService 接口)
- [BackgroundService 抽象类](#BackgroundService 抽象类)
IHostedService and BackgroundService
IHostedService和BackgroundService 是 ASP.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>();