原文地址 https://www.cnblogs.com/ysmc/p/18795934
之前写过一个文章,是介绍Longbow.Tasks这个定时任务调度库的,然后不少小伙伴问过我,怎么东西怎么用,也怪我,在那篇文章结尾我讲过要出实战的,后来抛之脑后了,实在惭愧。
简单讲下这个库的情况,Longbow.Tasks 于Gitee 上开源,这个是开源地址:https://gitee.com/Longbow/Longbow.Tasks ,最主要的是改库支持 NETFramework 4.5+ 与 NETCore 2.0+。
先来回顾一下怎么使用这个库:
初始化
.NET Core 中,包括 .NET 5 .NET 6 .NET 7…..需要注入服务
builder.Services.AddTaskServices();
NETFramework 4.5+
// 程序入口调用 TaskServicesManager.Init();
使用例子
1 //立即执行,仅执行一次 2 TaskServicesManager.GetOrAdd<TasksDemo>("任务唯一标识"); 3 4 //周期性任务 (1 分钟后间隔 5 秒执行2次任务) 5 var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build(); 6 7 TaskServicesManager.GetOrAdd<TasksDemo>("任务唯一标识", trigger); 8 9 //支持cron表达式,间隔 5 秒循环执行任务 10 TaskServicesManager.GetOrAdd<TasksDemo>("任务唯一标识", TriggerBuilder.Build("*/5 * * * * *")); 11 12 //这里重点关注,可以让你的任务接收 serviceProvider 参数,这样就可以使用注入的服务了 13 TaskServicesManager.GetOrAdd("任务唯一标识", async (serviceProvider, token) => 14 { 15 System.Console.WriteLine("任务唯一标识"); 16 await Task.Delay(1000); 17 }, TriggerBuilder.Build("*/5 12 * * * *"));
持久化
这里我使用 .NET 8 为例子,主要使用的是 依赖项注入-键控服务
1、我们先定义一个任务接口
public interface ITestService { Task Run(IServiceProvider serviceProvider); }
2、注册几个任务
builder.Services.AddKeyedTransient<ITestService, Test1Service>(“Test1”);
builder.Services.AddKeyedTransient<ITestService, Test2Service>(“Test2”);
builder.Services.AddKeyedTransient<ITestService, Test3Service>(“Test3”);
3、写一个 IHostedService,用于定时任务的添加
1 public class TestHostedService : IHostedService 2 { 3 private readonly IServiceProvider _serviceProvider; 4 5 public TestHostedService(IServiceProvider serviceProvider) 6 { 7 _serviceProvider = serviceProvider; 8 } 9 10 /// <summary> 11 /// 假设这里是从数据库中读取的定时任务 12 /// </summary> 13 public Dictionary<string, string> Servers = new Dictionary<string, string>() 14 { 15 //key为服务名称,value为cron表达式 16 ["Task1"] = "*/5 12 * * * *", 17 ["Task2"] = "*/10 12 * * * *", 18 ["Task3"] = "*/15 12 * * * *", 19 }; 20 21 public async Task StartAsync(CancellationToken cancellationToken) 22 { 23 await using var scope = _serviceProvider.CreateAsyncScope(); 24 foreach (var server in Servers) 25 { 26 // 根据服务名称获取服务 27 var testServices = scope.ServiceProvider.GetKeyedServices<ITestService>(server.Key); 28 if (testServices.Any()) 29 { 30 ///正常来说一个任务对应一个服务,这里只取第一个 31 var testService = testServices.First(); 32 // 添加定时任务 33 TaskServicesManager.GetOrAdd(server.Key, async (serviceProvider, token) => 34 { 35 await testService.Run(serviceProvider); 36 }, TriggerBuilder.Build(server.Value)); 37 } 38 } 39 } 40 41 public Task StopAsync(CancellationToken cancellationToken) 42 { 43 Console.WriteLine("StopAsync"); 44 45 return Task.CompletedTask; 46 } 47 }
代码就这么多,感谢各位大佬的观看!
来源链接:https://www.cnblogs.com/ysmc/p/18795934
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
暂无评论内容