qidao123.com技术社区-IT企服评测·应用市场
标题:
Longbow.Tasks 实战——任务持久化
[打印本页]
作者:
莱莱
时间:
2025-3-27 15:33
标题:
Longbow.Tasks 实战——任务持久化
原文地址
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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4