马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
原文地址 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("Test1");
builder.Services.AddKeyedTransient("Test2");
builder.Services.AddKeyedTransient("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 }
复制代码 代码就这么多,感谢各位大佬的观看!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|