翼度科技»论坛 编程开发 .net 查看内容

.NET Core 实现后台任务(定时任务)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
IHostedService和BackgroundService

前言

平时写代码的时候,大家多多少少都会遇到定时任务的要求,今天介绍两种定时任务的写法,严格来说其实是一种。
相对来说比较粗糙,请多多指教。
方法一 IHostedService

简介

IHostedService 接口

IHostedService 接口为主机托管的对象定义了两种方法:

  • StartAsync(CancellationToken)
  • StopAsync(CancellationToken)
StartAsync

StartAsync(CancellationToken) 包含用于启动后台任务的逻辑。
StartAsync应仅限于短期任务,因为托管服务是按顺序运行的,在StartAsync运行完成之前不会启动其他服务。
StopAsync

StopAsync(CancellationToken) 在主机执行正常关闭时触发。 StopAsync包含结束后台任务的逻辑。
StopAsync中调用的任何方法都应及时返回。
第一步 Program类添加相关配置
  1. // .Net 6
  2. builder.Services.AddHostedService<TestHostedService>();
  3. // .Net  5 及以下
  4. services.AddHostedService<TestHostedService>();
复制代码
第二步 创建操作类(HostedHelpsService)
  1. public class HostedHelpsService : IHostedService, IDisposable
  2. {
  3.     private Timer? _timer;
  4.     public Task StartAsync(CancellationToken cancellationToken)
  5.     {
  6.         _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
  7.         return Task.CompletedTask;
  8.     }
  9.     private void DoWork(object? state)
  10.     {
  11.         Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
  12.     }
  13.     public Task StopAsync(CancellationToken cancellationToken)
  14.     {
  15.         Console.WriteLine("StopAsync");
  16.         return Task.CompletedTask;
  17.     }
  18.     public void Dispose()
  19.     {
  20.         _timer?.Dispose();
  21.     }
  22. }
复制代码
方法二 BackgroundService

简介

BackgroundService 是 IHostedService的一个简单实现,内部IHostedService 的StartAsync调用了ExecuteAsync”,本质上就是使用了 IHostedService,BackgroundService 是用于实现长时间运行的 IHostedService 的基类。
调用 ExecuteAsync()来运行后台服务。 实现返回一个 Task,其表示后台服务的整个生存期。
第一步 创建服务类
  1. public interface IWorkService
  2. {
  3.     Task TaskWorkAsync(CancellationToken stoppingToken);
  4. }
复制代码
  1. public class WorkService : ITaskWorkService
  2. {
  3.     public async Task WorkAsync(CancellationToken stoppingToken)
  4.     {
  5.         while (!stoppingToken.IsCancellationRequested)
  6.         {
  7.             //执行任务
  8.             Console.WriteLine($"{DateTime.Now}");
  9.             //要添加await,不然任务将不会等待执行结果,直接进行下一个任务。
  10.             //周期性任务,于上次任务执行完成后,等待5秒,执行下一次任务
  11.             await Task.Delay(5000);
  12.         }
  13.     }
  14. }
复制代码
第二步 注册服务
  1. builder.Services.AddScoped<IWorkService, WorkService>();
复制代码
第三步 创建调用类
  1. public class BackgroundTestService : BackgroundService
  2. {
  3.     private readonly IServiceProvider _services;
  4.     public BackgroundTestService(IServiceProvider services)
  5.     {
  6.         _services = services;
  7.     }
  8.     protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  9.     {
  10.         using var scope = _services.CreateScope();
  11.                 //获取服务类
  12.         var taskWorkService = scope.ServiceProvider.GetRequiredService<IWorkService>();
  13.                   //执行服务类的定时任务
  14.         await taskWorkService.TaskWorkAsync(stoppingToken);
  15.     }
  16. }
复制代码
第四步 添加主机服务
  1. builder.Services.AddHostedService<BackgroundTestService>();
复制代码
来源:https://www.cnblogs.com/rsg-zxh/archive/2022/12/29/17013156.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具