文章目录
- 前言
- 1.BackgroundService是什么
- 一、BackgroundService实现任务调度
- 1.新建服务类
- 2.注册服务类
- 3.新建任务调度类
- 4.注册任务调度类
- 5.启动程序
前言
1.BackgroundService是什么
BackgroundService 是用于实现长时间运行的 IHostedService 的基类。
调用 ExecuteAsync(CancellationToken) 来运行后台服务。实现返回一个 Task,其表示后台服务的整个生存期。
在 ExecuteAsync 变为异步(例如通过调用 await)之前,不会启动任何其他服务。避免在 ExecuteAsync 中执行长时间的阻塞初始化工作。
StopAsync(CancellationToken) 中的主机块等待完成 ExecuteAsync。
调用 IHostedService.StopAsync 时,将触发取消令牌。当激发取消令牌以便正常关闭服务时,ExecuteAsync 的实现应立即完成。否则,服务将在关闭超时后不正常关闭。
StartAsync 应仅限于短期任务,因为托管服务是按顺序运行的,在 StartAsync 运行完成之前不会启动其他服务。长期任务应放置在 ExecuteAsync 中。
官网网址:https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.extensions.hosting.backgroundservice?view=dotnet-plat-ext-7.0
一、BackgroundService实现任务调度
1.新建服务类
ITaskWorkService.cs
代码语言:javascript复制public interface ITaskWorkService
{
Task TaskWorkAsync(CancellationToken stoppingToken);
}
TaskWorkService.cs
代码语言:javascript复制public class TaskWorkService : ITaskWorkService
{
public async Task TaskWorkAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
//执行任务
Console.WriteLine($"{DateTime.Now}");
//周期性任务,于上次任务执行完成后,等待5秒,执行下一次任务
await Task.Delay(500);
}
}
}
2.注册服务类
代码语言:javascript复制//注册定时任务执行的类
builder.Services.AddScoped<ITaskWorkService, TaskWorkService>();
3.新建任务调度类
代码语言:javascript复制/// <summary>
/// 定时任务类
/// </summary>
public class BackgroundServiceDemo : BackgroundService
{
private readonly IServiceProvider _services;
public BackgroundServiceDemo(IServiceProvider services)
{
_services = services;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var scope = _services.CreateScope();
//获取服务类
var taskWorkService = scope.ServiceProvider.GetRequiredService<ITaskWorkService>();
//执行服务类的定时任务
await taskWorkService.TaskWorkAsync(stoppingToken);
}
}
4.注册任务调度类
代码语言:javascript复制//添加主机服务
builder.Services.AddHostedService<BackgroundServiceDemo>();