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(),改变原先值的顺序,不占用内存 ''' # ...
- shiro实战系列(二)之入门实战续
下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...
- 解决IDEA因分配内存而引起的卡顿
解决IDEA分配内存不足引起卡顿的问题 在使用IDEA的过程中,经常会运行一段时间后程序卡顿.一段代码可能要敲很久或者出现死机状态,严重影响代码书写速度.经查阅资料,IDEA的自动分配内存最大只有75 ...
- log下一次坑爹的疏忽
今天调试一段十几行的代码,也让我是一顿咒骂...就说说是怎么回事哈哈. 是这样的,这个页面foreach了一个个的div块,每个div里有个a标签,这个按钮绑定了个点击事件.事件走了个ajax,根据返 ...
- Android开发四大组件之Service(具体解释篇)
Android开发之四大组件--Service 一.Service 简单介绍 Service是android系统中的四大组件之中的一个(Activity.Service.BroadcastReceiv ...
- Docker容器运行GUI程序的配置方法
0.环境说明 Ubuntu 16.04 docker 1.35 1.Docker的“可视化” Docker本身的工作模式是命令行的,因为主要的使用场景可能是做服务器后端方面的比较多. 但有时候我们会有 ...
- 2.4《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——小结
下Table 3本章重要命令小结 命令 描述 示例 > 将输出内容重定向到指定文件中 $ echo foo > foo.txt >> 将输出内容添加到指定问价中 $ echo ...
- C# WPF xml序列化 反序列化
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- 20155308『网络对抗技术』Exp7:网络欺诈防范
20155308『网络对抗技术』Exp7:网络欺诈防范 原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET ...
- 20155325 Exp2 后门原理与实践
基础问答 例举你能想到的一个后门进入到你系统中的可能方式? 乱点链接 学电脑小白不正确配置电脑 下载非官网软件 例举你知道的后门如何启动起来(win及linux)的方式? 软件:ncat socat ...