zoukankan      html  css  js  c++  java
  • 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.-->
     
  • 相关阅读:
    准备活动
    几个很好的.Net开源框架
    windows 进程通信(使用DDE)(转)
    mysql error 1046 1064 1264 (ERROR大全)
    在版本库里建立版本
    20120206系统日志
    Cocos2dx项目从VS移植到Xcode中的配置
    用python解析JSON
    win10下vc++6.0的安装问题
    Python爬虫(一)抓取指定的页面
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/10859305.html
Copyright © 2011-2022 走看看