Quartz.NET官网 TopShelf 网址
代码地址:https://github.com/SeaLee02/ProjectDemo/tree/master/WindowServerDemo
①新建一个控制台 WindowServerDemo ②下载nuget包
Topshelf
Topshelf.Log4Net --附带 log4net
Quartz
Quartz.Jobs
Quartz.Plugins --不然在获取的会报错StdSchedulerFactory.GetDefaultScheduler().Result
③创建 ServiceRunner 类来开始服务

public class ServiceRunner:ServiceControl, ServiceSuspend { private readonly IScheduler scheduler; public ServiceRunner() { scheduler = StdSchedulerFactory.GetDefaultScheduler().Result; } /// <summary> /// 线程开始方法 /// </summary> /// <param name="hostControl"></param> /// <returns></returns> public bool Start(HostControl hostControl) { scheduler.Start(); MyLoggerManager.AppLogger.InfoFormat("线程开始"); return true; } /// <summary> /// 线程结束 /// </summary> /// <param name="hostControl"></param> /// <returns></returns> public bool Stop(HostControl hostControl) { scheduler.Shutdown(false); MyLoggerManager.AppLogger.InfoFormat("线程结束"); return true; } public bool Continue(HostControl hostControl) { scheduler.ResumeAll(); return true; } public bool Pause(HostControl hostControl) { scheduler.PauseAll(); return true; } }
④创建 MyJob类实现完成的方法
/// <summary> /// job(可以设置多个job,频率设置不一样,就会执行各自的方法) /// </summary> public class MyJob: IJob { /// <summary> /// 执行的入口,你的业务 /// </summary> /// <param name="context"></param> /// <returns></returns> public async Task Execute(IJobExecutionContext context) { //每过多长时间会执行这个方法 await Console.Out.WriteLineAsync($"{DateTime.Now.ToString("yyyy:MM:dd HH:mm:ss")} 开始执行服务"); } }
⑤Program 开始执行
public static void Test() { //需要配置使用log4net FileInfo log = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(log); HostFactory.Run(x => { x.UseLog4Net(); x.Service<ServiceRunner>(); x.RunAsLocalSystem(); x.SetDescription("WindowServerDemo服务的描述"); //设置服务的描述 x.SetDisplayName("WindowServerDemo显示名称"); //服务显示的名称 x.SetServiceName("WindowServerDemo服务名称"); //服务名称 }); }
⑥ log4net.config ,quartz.config ,quartz_jobs.xml 属性都需要设置为如果较新则复制
效果:
安装,启用,暂停,删除服务
把*.bat跟我们的exe程序放到同一个目录,右键管理员运行*.bat
在我们的电脑上就会存在这个服务,如果运行就会一直执行你的代码

<!-- 从start-time起,每5s执行一次IJob.Execute --> <!--<start-time>2012-01-22T00:00:00+08:00</start-time>--> <!--每隔10秒执行一次--> <!--<cron-expression>*/10 * * * * ?</cron-expression>--> <!--每隔1分钟执行一次--> <!--<cron-expression>0 */1 * * * ?</cron-expression>--> <cron-expression>0 */5 * * * ?</cron-expression> <!--由7段构成:秒 分 时 日 月 星期 年(可选) "-" :表示范围 MON-WED表示星期一到星期三 "," :表示列举 MON,WEB表示星期一和星期三 "*" :表是“每”,每月,每天,每周,每年等 "/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始 "?" :只能出现在日,星期段里面,表示不指定具体的值 "L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六) "W" :表示工作日,距离给定值最近的工作日 "#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)--> <!--0 0 12 * * ? 每天中午12点触发 0 15 10 ? * * 每天上午10:15触发 0 15 10 * * ? 每天上午10:15触发 0 15 10 * * ? * 每天上午10:15触发 0 15 10 * * ? 2005 2005年的每天上午10:15触发 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 0 15 10 15 * ? 每月15日上午10:15触发 0 15 10 L * ? 每月最后一日的上午10:15触发 0 15 10 L-2 * ? Fire at 10:15am on the 2nd-to-last last day of every month 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month 0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发 0 0 12 1/5 * ? Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. 0 11 11 11 11 ? Fire every November 11th at 11:11am.-->