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;
}
}
④创建 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>--22T00::+:</start-time>--> <!--每隔10秒执行一次-->
<!--<cron-expression>*/ * * * * ?</cron-expression>-->
<!--每隔1分钟执行一次-->
<!--<cron-expression> */ * * * ?</cron-expression>--> <cron-expression> */ * * * ?</cron-expression> <!--由7段构成:秒 分 时 日 月 星期 年(可选)
"-" :表示范围 MON-WED表示星期一到星期三
"," :表示列举 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:/(处于分钟段里面) 每15分钟,在0分以后开始,/ 每20分钟,从3分钟以后开始
"?" :只能出现在日,星期段里面,表示不指定具体的值
"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"W" :表示工作日,距离给定值最近的工作日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(=SUN...=FRI,=SAT)--> <!-- * * ? 每天中午12点触发
? * * 每天上午10:15触发
* * ? 每天上午10:15触发
* * ? * 每天上午10:15触发
* * ? 2005年的每天上午10:15触发
* * * ? 在每天下午2点到下午2:59期间的每1分钟触发
/ * * ? 在每天下午2点到下午2:55期间的每5分钟触发
/ , * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
- * * ? 在每天下午2点到下午2:05期间的每1分钟触发
, ? WED 每年三月的星期三的下午2:10和2:44触发
? * MON-FRI 周一至周五的上午10:15触发
* ? 每月15日上午10:15触发
L * ? 每月最后一日的上午10:15触发
L- * ? Fire at :15am on the 2nd-to-last last day of every month
? * 6L 每月的最后一个星期五上午10:15触发
? * 6L Fire at :15am on the last Friday of every month
? * 6L - 2002年至2005年的每月的最后一个星期五上午10:15触发
? * # 每月的第三个星期五上午10:15触发
/ * ? Fire at 12pm (noon) every days every month, starting on the first day of the month.
? Fire every November 11th at :11am.-->
TopShelf+Quartz.net 实现window服务的更多相关文章
- .net core+topshelf+quartz创建windows定时任务服务
		.net core+topshelf+quartz创建windows定时任务服务 准备工作 创建.net core 控制台应用程序,这里不做过多介绍 添加TopShelf包:TopShelf: 添加Q ... 
- Topshelf+Quartz.net+Dapper+Npoi(一)
		背景 前段时间公司有个需求(每天给业务导出一批数据,以excel的形式通过邮件发送给他).A说:直接写个服务,判断等于某个时间点,执行一下sql语句,生成excel,写个EmaiHelper发送给他不 ... 
- Window服务与Quartz.NET
		Quartz.NET: http://quartznet.sourceforge.net/ (现为2.2版本) Sourceforge:http://sourceforge.net/projects/ ... 
- CrystalQuartz实现Quartz的window服务的远程管理
		1. 建一个空的ASP.NET WebSite,利用NuGet安装CrystalQuartz.Remote 包 我们可以看到,配置文件中多了如下节点: <crystalQuartz> &l ... 
- Window服务基于Quartz.Net组件实现定时任务调度(二)
		前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ... 
- Window服务项目脚手架
		本人最近工作用到window服务程序,于是尝试分享下经验,开源了一个window服务脚手架项目,把window服务程序必不可少的组件集成进去,如日志组件log4net,window服务挂在后台,用日志 ... 
- C#编写window服务,一步一步(1)
		Window服务是啥,这里就不废话了,如何用在哪里用也不废话了,这里我这篇文章只是详述了我在vs2012中创建window服务的经过,希望对你有所帮助. 另外:我在编写服务过程中参考了 Profess ... 
- topshelf包装redis为windows服务
		topshelf包装redis为windows服务 Redis服务端目前用的是控制台程序运行,部署的时候能作为windows服务后台运行感觉更好.找到一篇文章Running Redis as a Wi ... 
- WPF Window 服务安装
		一.安装服务 1.已管理员的身份启动CMD 2.输入 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 回车 3.输入 InstallUtil.exe ... 
随机推荐
- 【大数据】Hadoop单机安装配置
			1.解压缩hadoop-2.7.6.tar.gz到/home/hadoop/Soft目录中 2.创建软链接,方便hadoop升级 ln -s /home/hadoop/Soft/hadoop-2.7 ... 
- Spring AOP(面向切面编程)
			AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理.日志管理.权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性. 简单例子: ... 
- iOS App开发那些事:如何选择合适的人、规范和框架?
			http://www.cocoachina.com/ios/20141202/10386.html 自从做Team Leader之后,身上权责发生了变化,于是让我烦恼的不再是具体某个功能,某个界面的实 ... 
- 2019阿里JVM组实习面经
			面试质量非常高....非常高...高... 一面 自我介绍 看过hotspot哪些模块,模板解释器工作说一下,生成的native code放在哪,怎么处理safepoint的 说项目,实现了哪些字节码 ... 
- 最小球覆盖——模拟退火&&三分套三分套三分
			题目 给出 $N(1 \leq N \leq 100)$ 个点的坐标 $x_i,y_i,z_i$($-100000 \leq x_i,y_i,z_i \leq 100000$),求包围全部点的最小的球 ... 
- NYOJ469 - 擅长排列的小明 II - (dp)
			题目描述: 小明十分聪明,而且十分擅长排列计算. 有一天小明心血来潮想考考你,他给了你一个正整数n,序列1,2,3,4,5......n满足以下情况的排列: 1.第一个数必须是1 2.相邻两个数之差不 ... 
- LeetCode 491. Increasing Subsequences
			原题链接在这里:https://leetcode.com/problems/increasing-subsequences/ 题目: Given an integer array, your task ... 
- linux学习16 Linux用户和组管理命令演练和实战应用
			一.上集回顾 1.bash globing,IO重定向及管道 glob:*,?,[],[^] IO重定向: >,>>, 2>,2>> &>,& ... 
- Json提取器(Json Extractor)
			Variable names:保存的变量名,后面使用${Variable names}引用 JSON Path expressions:调试通过的json path表达式 Match Numbers ... 
- BZOJ 4459: [Jsoi2013]丢番图 数学推导
			之前绝对做过几乎一模一样的题,现在做竟然忘了. code: #include <bits/stdc++.h> #define ll long long #define setIO(s) f ... 
 
			
		