欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Topshelf+Quatz.Net的简单使用

程序员文章站 2023-11-14 10:30:40
Topshelf+Quatz.Net的简单使用 一 Topshelf概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建 ......

topshelf+quatz.net的简单使用

一  topshelf概述

  topshelf是创建windows服务的另一种方法,老外的一篇文章create a .net windows service in 5 steps with topshelf通过5个步骤详细的介绍使用使用topshelf创建windows 服务。topshelf是一个开源的跨平台的宿主服务框架,支持windows和mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

二  topshelf使用

1  新建timer定时任务,并在topshelf中使用

 1 public class towncrier
 2     {
 3         private readonly timer timer;
 4         public towncrier()
 5         {
 6             timer = new timer(1000) { autoreset = true };
 7             timer.elapsed += (sender,eventargs) => console.writeline($"it is {datetime.now} and all is well");
 8         }
 9         public void start()
10         {
11             timer.start();
12         }
13         public void stop()
14         {
15             timer.stop();
16         }
17 
18     }
19 
20 static void main(string[] args)
21         {
22             hostfactory.run(x =>
23             {
24                 x.service<towncrier>(s =>
25                 {
26                     s.constructusing(name => new towncrier());
27                     s.whenstarted(tc => tc.start());
28                     s.whenstopped(tc => tc.stop());
29                 });
30                 x.runaslocalsystem();
31                 x.setdescription("quartznet任务调度服务,灵活配置任务计划");
32                 x.setdisplayname("quartzjobshedule");
33                 x.setservicename("quartz任务调度框架");
34             }
35             );
36         }

2  执行程序,正常运行,效果如下

Topshelf+Quatz.Net的简单使用

三  quartz.net概述

       在项目的开发过程中,难免会遇见后需要后台处理的任务,例如定时发送邮件通知、后台处理耗时的数据处理等,这个时候可以使用quartz.net

  quartz.net是纯净的,它是一个.net程序集,是非常流行的java作业调度系统quartz的c#实现。

  quartz.net是一款功能齐全的任务调度系统,从小型应用到大型企业级系统都能适用。功能齐全体现在触发器的多样性上面,即支持简单的定时器,也支持cron表达式;即能执行重复的作业任务,也支持指定例外的日历;任务也可以是多样性的,只要继承ijob接口即可。

  对于小型应用,可以集成到你的系统中,对于企业级系统,它提供了routing支持,提供了group来组织和管理任务,此外还有持久化、插件功能、负载均衡和故障迁移等满足不同应用场景的需要。

四  quartz.net使用

 1  创建一个任务,继承ijob接口

 1 /// <summary>
 2     /// 继承ijob的一个任务
 3     /// </summary>
 4     public class helloquartzjob : ijob
 5     {
 6         public task execute(ijobexecutioncontext context)
 7         {
 8             return task.factory.startnew(() =>
 9             {
10                 console.writeline("hello quartz.net");
11             });
12         }
13     }

2  在程序启动时创建调度器(scheduler),并添加helloquartzjob的调度

 1 static async task main(string[] args)
 2         {
 3             //从工厂中获取调度器实例
 4             var scheduler = await stdschedulerfactory.getdefaultscheduler();
 5 
 6             //创建作业和触发器
 7             var jobdetail = jobbuilder.create<helloquartzjob>().build();
 8             var trigger = triggerbuilder.create()
 9                                         .withsimpleschedule(m =>
10                                         {
11                                             m.withrepeatcount(10).withintervalinseconds(1);
12                                         })
13                                         .build();
14 
15             console.writeline($"任务调度器已启动");
16 
17             //添加调度
18             await scheduler.schedulejob(jobdetail, trigger);
19 
20             await scheduler.start();
21             console.readkey();
22         }

3  执行结果

Topshelf+Quatz.Net的简单使用

五  topshelf+quartz.net

1  创建quartz的调度器类,实现start和stop方法

 1 public class jobconfigure
 2     {
 3         private ischeduler scheduler;
 4 
 5         public async task getjobconfigure()
 6         {
 7             //从工厂中获取调度器实例
 8             scheduler = await stdschedulerfactory.getdefaultscheduler();
 9             //创建作业和触发器
10             var jobdetail = jobbuilder.create<helloquartzjob>().build();
11             var trigger = triggerbuilder.create().withschedule(simpleschedulebuilder.repeatsecondlyforever(1).withrepeatcount(10))
12                                         .build();
13             //添加调度
14             await scheduler.schedulejob(jobdetail, trigger);
15         }
16 
17         public void start()
18         {
19             this.getjobconfigure().wait();
20             scheduler.start();
21         }
22         public void stop()
23         {
24             scheduler.shutdown(true);
25         }
26         
27     }

2  在启动程序中创建调度器(scheduler),并添加jobconfigure的调度

 1 static void main(string[] args)
 2         {
 3             hostfactory.run(x =>
 4             {
 5                 x.service<jobconfigure>(s =>
 6                 {
 7                     s.constructusing(name => new jobconfigure());
 8                     s.whenstarted(tc => tc.start());
 9                     s.whenstopped(tc => tc.stop());
10                 });
11                 x.runaslocalsystem();
12                 x.setdescription("quartznet任务调度服务,灵活配置任务计划");
13                 x.setdisplayname("quartzjobshedule");
14                 x.setservicename("quartz任务调度框架");
15             }
16             );
17         }

3  启动程序

Topshelf+Quatz.Net的简单使用