TopShelf+Quartz.net 实现window服务

Posted sea1ee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
在我们的电脑上就会存在这个服务,如果运行就会一直执行你的代码
技术图片

 

 

 

以上是关于TopShelf+Quartz.net 实现window服务的主要内容,如果未能解决你的问题,请参考以下文章

quartz3.0.7和topshelf4.2.1实现任务调度

Quartz.NET总结如何根据自己需要配置Topshelf 服务

Quartz 配置文件详解

quartz.net 基于数据库的简单实现

简单实现Windows服务 TopShelf

Hosted Services+Quartz实现定时任务调度