windows 服务实现定时任务调度(Quartz.Net)
我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了。
首先创建一个windows服务项目(详细信息请参阅:C#创建Windows Service(Windows 服务)基础教程)
在创建好的项目中点击“单击此处切换到代码视图”切换到代码
我们主要关注一下两个方法:
• OnStart – 控制服务启动
• OnStop – 控制服务停止
例:
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
//todo:这里是服务启动所执行的代码
} protected override void OnStop()
{
//todo:这里是服务停止所执行的代码
}
}
下面我们可以写一个定时任务的功能了:
private void StartDoSomething()
{
System.Timers.Timer timer = new System.Timers.Timer(); //间隔10秒
timer.AutoReset = true;
timer.Enabled = false; //执行一次
timer.Elapsed += new ElapsedEventHandler(ExecutionCode);
timer.Start();
} private void ExecutionCode(object source, System.Timers.ElapsedEventArgs e)
{
string dtNow = DateTime.Now.ToString("HH:mm");
if (dtNow == "12:00")
{
File.WriteAllText("D:/ExecutionService.txt", "服务执行了一次任务", Encoding.UTF8);
}
}
然后在OnStart的方法中调用上面的StartDoSomething的方法
protected override void OnStart(string[] args)
{
StartDoSomething();
}
以上就可以算是一个简单的定时执行任务的windows服务了,这里我们还可以使用Quartz.Net来实现更加强大的任务调度功能。
首先来介绍一下Quartz.Net这个框架:
简介:Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作。相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气,上档次了。目前最新版本是2.2,新的版本里面有些方法名发生了变化,从之前的版本用过来的人应该会有体会.这里我使用最常用,也是最稳定的方式--Windows服务里面使用Quartz.net,并且使用配置的方式来设置触发器。(以上内容摘自网络)
简单的理解就是它能够帮我们定时的做事,相当于闹钟能够叫我们起床一样。
目前最新的版本是Quartz.NET 2.2.3大家可以在这里下载
现在我们需要在刚刚创建的服务项目中引用如下文件:
在配置文件中写好自己的配置(本例子演示定时访问指定网站)
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="JobList">
<section name="Job" type="MyService1101.MyConfigHandler,MyService1101"/>
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<JobList>
<Job> <!--这里是一个任务节点-->
<add key="Url" value="http://www.baidu.com" /> <!--需要访问的Url-->
<add key="Hour" value="10" /> <!--开始时间小时,注意:这里的小时为0-23,如果是1点的话就是1,而不是01-->
<add key="Minute" value="30"/> <!--开始时间分钟,注意:同上0-59-->
</Job>
</JobList>
</configuration>
新建一个MyConfigHandler.cs类来读取自定义配置节点
public class MyConfigHandler : IConfigurationSectionHandler
{
public MyConfigHandler()
{
} public object Create(object parent, object configContext, System.Xml.XmlNode section)
{
NameValueCollection configs;
NameValueSectionHandler baseHandler = new NameValueSectionHandler();
configs = (NameValueCollection)baseHandler.Create(parent, configContext, section);
return configs;
}
}
然后新建一个SystemScheduler类来创建调度程序
public class SystemScheduler
{
private SystemScheduler()
{
} public static SystemScheduler CreateInstance()
{
return new SystemScheduler();
} private IScheduler _scheduler; public void StartScheduler()
{
//这里读取配置文件中的任务开始时间
int hour = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Hour"]);
int minute = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Minute"]); ISchedulerFactory schedulerFactory = new StdSchedulerFactory();//内存调度
_scheduler = schedulerFactory.GetScheduler(); //创建一个Job来执行特定的任务
IJobDetail synchronousData = new JobDetailImpl("SynchronousData", typeof(SynchronousData));
//创建并定义触发器的规则(每天执行一次时间为:时:分)
ITrigger trigger =
TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule(
a => a.WithIntervalInHours().OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(hour, minute))).Build();
//将创建好的任务和触发规则加入到Quartz中
_scheduler.ScheduleJob(synchronousData, trigger);
//开始
_scheduler.Start();
} public void StopScheduler()
{
_scheduler.Shutdown();
}
}
新建一个SynchronousData类,让其实现IJob接口来实现SystemScheduler中自定义的任务
public class SynchronousData : IJob
{
public void Execute(IJobExecutionContext context)
{
string Url = ((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Url"];
WebClient wc = new WebClient();
WebRequest wr = WebRequest.Create(new Uri(Url));
using (StreamWriter sw = File.AppendText(@"d:\SchedulerService.txt"))
{
sw.WriteLine("------------------" + "MyService服务在:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 执行了一次任务" + "------------------");
sw.Flush();
}
}
}
最后在OnStart中添加对这个调度程序的应用
protected override void OnStart(string[] args)
{
SystemScheduler _systemScheduler = SystemScheduler.CreateInstance();
_systemScheduler.StartScheduler();
}
程序生成后我们可以通过指令安装它
安装完成后在服务中会有一个新的服务项
程序运行过后会在D:盘生成一个SchedulerService.txt文件
本程序源码:下载
windows 服务实现定时任务调度(Quartz.Net)的更多相关文章
- asp.net基于windows服务实现定时发送邮件的方法
本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法.分享给大家供大家参考,具体如下: //定义组件 private System.Timers.Timer time; publi ...
- C#创建windows服务并定时执行
一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...
- C#基于Quartz.NET实现任务调度并部署Windows服务
一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...
- Windows服务 + Quartz.NET
服务基础 安装管理员打开cmd cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 InstallUtil.exe Path_WinSvc.exe 或者 ...
- 不用写Windows服务实现定时器功能(FluentScheduler )
MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...
- 使用windows服务更新站点地图
由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象.为减轻数据库压力,我上个月对公司项目做了下调整.把新闻板块提取出来单独一个站点,单独一个数据库.减少了主站点和数据库的负担和压力. ...
- [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...
- Windows 服务入门指南
有很多时候,我们需要创建Windows Service. 这篇文章可以算是一个入门指南吧,希望对初学者有帮助. 要创建Windows Service, 首先选择Windows服务项目,如下图: 这里我 ...
- Quartz任务调度 服务日志+log4net打印日志+制作windows服务
引言 现在许多的项目都需要定时的服务进行支撑,而我们经常用到的定时服务就是Quartz任务调度了.不过我们在使用定时Job进行获取的时候,有时候我们就需要记录一下自定义的日志,甚至我们还会对执行定时J ...
随机推荐
- numpy 的排序
import numpy as np # 1.快速排序 ''' 1.np.sort(),不改变原先值的顺序,但是在运行时占内存 2.ndarry.sort(),改变原先值的顺序,不占用内存 ''' # ...
- [Java123] JBoss
https://blog.csdn.net/taogebx/article/details/4620760
- day3-作业及答案
作业:1.用python实现冒泡排序# [50,20,30,10]## 升序:谁大谁交换到后面# 降序:谁大谁交换到前面## 以升序为例# 第1趟:# [20,50,30,10]# [20,30,50 ...
- Node.js实战(十二)之Stream
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...
- JS图片灯箱(lightBox)效果基本原理和demo
到年底了,项目不怎么忙,所以有空特地研究了下KISSY中源码JS灯箱效果,感觉代码比较简单,所以就按照他们的思路依赖于Jquery框架也封装了一个,特地分享给大家,以前经常看到网上很多这样的插件,感觉 ...
- Python - for 循环
Python 3 - for 循环 这次将为大家介绍 Python 3 中的 for 循环语句的使用 for 循环的一般格式如下: for <variable> in <seque ...
- Android cannot be cast to android.app.Fragment
10-21 17:33:45.171: E/AndroidRuntime(7644): java.lang.RuntimeException: Unable to start activity Com ...
- mssql2012的分页查询
sql2102支持的分页查询 注意:以下都是先执行排序,再取行数据 select* from t_workers order by worker_id desc offset 3 rows --先 ...
- 20155334 曹翔 《网络对抗》逆向及Bof基础
20155334 曹翔 <网络对抗>逆向及Bof基础 实践目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...
- flaskr 报错及其修改
作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...