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 ...
随机推荐
- ruby中的整数、浮点数、字符串之间的相互转换
D:\learnProg\Ruby>irb#浮点数转换成整数,会强行去掉小数点后面的数字 irb(main):017:0> 123.45.to_i => 123 #整数转换成浮点数, ...
- 欢迎访问阿里云Go Module代理仓库服务
简介 go module公共代理仓库,代理并缓存go模块.你可以利用该代理来避免DNS污染导致的模块拉取缓慢或失败的问题,加速你的构建. 地址 https://mirrors.aliyun.com/g ...
- cf1173 D. Nauuo and Circle
链接 [cf]http://codeforces.com/contest/1175/problem/F) 思路 当1在1的位置做dp[i]为i的子树所有的方案. 一条性质是i的子树所占圆上的位置一定一 ...
- bzoj1176: [Balkan2007]Mokia cdq
链接 bzoj 思路 cdq入门题,拆成4个矩阵,然后cdq. 代码 /************************************************************** P ...
- A&G¥C015
A&G¥C015 A A+...+B Problem 正常A+B我还是会的,但是又加了个省略号就不会了/kk B Evilator 不会 C Nuske vs Phantom Thnook 以 ...
- 【CF1142B】Lynyrd Skynyrd
[CF1142B]Lynyrd Skynyrd 题面 洛谷 题解 假设区间\([l,r]\)内有一个循环位移,那么这个循环位移一定有一个最后的点,而这个点在循环位移中再往前移\(n-1\)个位置也一定 ...
- C函数之index、strtoul
index函数 函数定义: #include<strings.h> char *index(const char *s, int c); 函数说明: 找出参数s字符串中第一个出现参数c的地 ...
- ImportError: cannot import name 'DjangoSuitConfig'
pip3.6 install https://github.com/darklow/django-suit/tarball/v2
- bat 添加环境变量
修改环境变量 :输入 “set 变量名=变量内容”即可,比如将path设置为“d:\hacker.exe”,只要输入set path="d:\nmake.exe".注意,此修改环境 ...
- 第08组 Alpha冲刺(3/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11872693.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
