|
IHostedService和BackgroundService
前言
平时写代码的时候,大家多多少少都会遇到定时任务的要求,今天介绍两种定时任务的写法,严格来说其实是一种。
相对来说比较粗糙,请多多指教。
方法一 IHostedService
简介
IHostedService 接口
IHostedService 接口为主机托管的对象定义了两种方法:
- StartAsync(CancellationToken)
- StopAsync(CancellationToken)
StartAsync
StartAsync(CancellationToken) 包含用于启动后台任务的逻辑。
StartAsync应仅限于短期任务,因为托管服务是按顺序运行的,在StartAsync运行完成之前不会启动其他服务。
StopAsync
StopAsync(CancellationToken) 在主机执行正常关闭时触发。 StopAsync包含结束后台任务的逻辑。
StopAsync中调用的任何方法都应及时返回。
第一步 Program类添加相关配置
- // .Net 6
- builder.Services.AddHostedService<TestHostedService>();
- // .Net 5 及以下
- services.AddHostedService<TestHostedService>();
复制代码 第二步 创建操作类(HostedHelpsService)
- public class HostedHelpsService : IHostedService, IDisposable
- {
- private Timer? _timer;
- public Task StartAsync(CancellationToken cancellationToken)
- {
- _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
- return Task.CompletedTask;
- }
- private void DoWork(object? state)
- {
- Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
- }
- public Task StopAsync(CancellationToken cancellationToken)
- {
- Console.WriteLine("StopAsync");
- return Task.CompletedTask;
- }
- public void Dispose()
- {
- _timer?.Dispose();
- }
- }
复制代码 方法二 BackgroundService
简介
BackgroundService 是 IHostedService的一个简单实现,内部IHostedService 的StartAsync调用了ExecuteAsync”,本质上就是使用了 IHostedService,BackgroundService 是用于实现长时间运行的 IHostedService 的基类。
调用 ExecuteAsync()来运行后台服务。 实现返回一个 Task,其表示后台服务的整个生存期。
第一步 创建服务类
- public interface IWorkService
- {
- Task TaskWorkAsync(CancellationToken stoppingToken);
- }
复制代码- public class WorkService : ITaskWorkService
- {
- public async Task WorkAsync(CancellationToken stoppingToken)
- {
- while (!stoppingToken.IsCancellationRequested)
- {
- //执行任务
- Console.WriteLine($"{DateTime.Now}");
- //要添加await,不然任务将不会等待执行结果,直接进行下一个任务。
- //周期性任务,于上次任务执行完成后,等待5秒,执行下一次任务
- await Task.Delay(5000);
- }
- }
- }
复制代码 第二步 注册服务
- builder.Services.AddScoped<IWorkService, WorkService>();
复制代码 第三步 创建调用类
- public class BackgroundTestService : BackgroundService
- {
- private readonly IServiceProvider _services;
- public BackgroundTestService(IServiceProvider services)
- {
- _services = services;
- }
- protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- {
- using var scope = _services.CreateScope();
- //获取服务类
- var taskWorkService = scope.ServiceProvider.GetRequiredService<IWorkService>();
- //执行服务类的定时任务
- await taskWorkService.TaskWorkAsync(stoppingToken);
- }
- }
复制代码 第四步 添加主机服务
- builder.Services.AddHostedService<BackgroundTestService>();
复制代码 来源:https://www.cnblogs.com/rsg-zxh/archive/2022/12/29/17013156.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|