TopShelf+Quartz.net 实现window服务

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;
        }
    }
View Code

  

④创建 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.-->
 
原文地址:https://www.cnblogs.com/Sea1ee/p/10859305.html