我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了。

首先创建一个windows服务项目(详细信息请参阅:C#创建Windows Service(Windows 服务)基础教程

    

在创建好的项目中点击“单击此处切换到代码视图”切换到代码

我们主要关注一下两个方法:

  • OnStart – 控制服务启动
  • OnStop – 控制服务停止

  例:

 1     public partial class Service1 : ServiceBase
 2     {
 3         public Service1()
 4         {
 5             InitializeComponent();
 6         }
 7
 8         protected override void OnStart(string[] args)
 9         {
10             //todo:这里是服务启动所执行的代码
11         }
12
13         protected override void OnStop()
14         {
15             //todo:这里是服务停止所执行的代码
16         }
17     }

View Code

下面我们可以写一个定时任务的功能了:

  

 1      private void StartDoSomething()
 2         {
 3             System.Timers.Timer timer = new System.Timers.Timer(10000); //间隔10秒
 4             timer.AutoReset = true;
 5             timer.Enabled = false;  //执行一次
 6             timer.Elapsed += new ElapsedEventHandler(ExecutionCode);
 7             timer.Start();
 8         }
 9
10         private void ExecutionCode(object source, System.Timers.ElapsedEventArgs e)
11         {
12             string dtNow = DateTime.Now.ToString("HH:mm");
13             if (dtNow == "12:00")
14             {
15                 File.WriteAllText("D:/ExecutionService.txt", "服务执行了一次任务", Encoding.UTF8);
16             }
17         }

然后在OnStart的方法中调用上面的StartDoSomething的方法

1         protected override void OnStart(string[] args)
2         {
3             StartDoSomething();
4         }    

以上就可以算是一个简单的定时执行任务的windows服务了,这里我们还可以使用Quartz.Net来实现更加强大的任务调度功能。

首先来介绍一下Quartz.Net这个框架:

  简介:Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作。相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气,上档次了。目前最新版本是2.2,新的版本里面有些方法名发生了变化,从之前的版本用过来的人应该会有体会.这里我使用最常用,也是最稳定的方式--Windows服务里面使用Quartz.net,并且使用配置的方式来设置触发器。(以上内容摘自网络)

  简单的理解就是它能够帮我们定时的做事,相当于闹钟能够叫我们起床一样。

  目前最新的版本是Quartz.NET 2.2.3 大家可以在这里下载

  现在我们需要在刚刚创建的服务项目中引用如下文件:

    

  在配置文件中写好自己的配置(本例子演示定时访问指定网站)

 1 <?xml version="1.0"?>
 2 <configuration>
 3   <configSections>
 4     <sectionGroup name="JobList">
 5       <section name="Job" type="MyService1101.MyConfigHandler,MyService1101"/>
 6     </sectionGroup>
 7   </configSections>
 8   <startup>
 9     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
10   </startup>
11   <JobList>
12     <Job>   <!--这里是一个任务节点-->
13       <add key="Url" value="http://www.baidu.com" />  <!--需要访问的Url-->
14       <add key="Hour" value="10" />   <!--开始时间小时,注意:这里的小时为0-23,如果是1点的话就是1,而不是01-->
15       <add key="Minute" value="30"/>    <!--开始时间分钟,注意:同上0-59-->
16     </Job>
17   </JobList>
18 </configuration>

View Code

  新建一个MyConfigHandler.cs类来读取自定义配置节点

 1 public class MyConfigHandler : IConfigurationSectionHandler
 2     {
 3         public MyConfigHandler()
 4         {
 5         }
 6
 7         public object Create(object parent, object configContext, System.Xml.XmlNode section)
 8         {
 9             NameValueCollection configs;
10             NameValueSectionHandler baseHandler = new NameValueSectionHandler();
11             configs = (NameValueCollection)baseHandler.Create(parent, configContext, section);
12             return configs;
13         }
14     }

View Code

  然后新建一个SystemScheduler类来创建调度程序

 1     public class SystemScheduler
 2     {
 3         private SystemScheduler()
 4         {
 5         }
 6
 7         public static SystemScheduler CreateInstance()
 8         {
 9             return new SystemScheduler();
10         }
11
12         private IScheduler _scheduler;
13
14         public void StartScheduler()
15         {
16             //这里读取配置文件中的任务开始时间
17             int hour = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Hour"]);
18             int minute = int.Parse(((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Minute"]);
19
20             ISchedulerFactory schedulerFactory = new StdSchedulerFactory();//内存调度
21             _scheduler = schedulerFactory.GetScheduler();
22
23             //创建一个Job来执行特定的任务
24             IJobDetail synchronousData = new JobDetailImpl("SynchronousData", typeof(SynchronousData));
25             //创建并定义触发器的规则(每天执行一次时间为:时:分)
26             ITrigger trigger =
27                 TriggerBuilder.Create()
28                     .WithDailyTimeIntervalSchedule(
29                         a => a.WithIntervalInHours(24).OnEveryDay().StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(hour, minute))).Build();
30             //将创建好的任务和触发规则加入到Quartz中
31             _scheduler.ScheduleJob(synchronousData, trigger);
32             //开始
33             _scheduler.Start();
34         }
35
36         public void StopScheduler()
37         {
38             _scheduler.Shutdown();
39         }
40     }

View Code

  新建一个SynchronousData类,让其实现IJob接口来实现SystemScheduler中自定义的任务

 1     public class SynchronousData : IJob
 2     {
 3         public void Execute(IJobExecutionContext context)
 4            {
 5             string Url = ((NameValueCollection)ConfigurationSettings.GetConfig("JobList/Job"))["Url"];
 6             WebClient wc = new WebClient();
 7             WebRequest wr = WebRequest.Create(new Uri(Url));
 8             using (StreamWriter sw = File.AppendText(@"d:\SchedulerService.txt"))
 9             {
10                 sw.WriteLine("------------------" + "MyService服务在:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "     执行了一次任务" + "------------------");
11                 sw.Flush();
12             }
13         }
14     }

View Code

  最后在OnStart中添加对这个调度程序的应用

1         protected override void OnStart(string[] args)
2         {
3             SystemScheduler _systemScheduler = SystemScheduler.CreateInstance();
4             _systemScheduler.StartScheduler();
5         }   

  程序生成后我们可以通过指令安装它

  安装完成后在服务中会有一个新的服务项

  

  程序运行过后会在D:盘生成一个SchedulerService.txt文件

  

  本程序源码:下载

2. Quartz 定时器时间设置

http://www.360doc.com/content/11/1017/10/1542811_156808468.shtml

Quartz

spring定时器的时间设置
时间的配置如下:<value>0 26 16 * * ?</value> 
时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年    *为任意 ?为无限制。 由此上面所配置的内容就是,在每天的16点26分启动buildSendHtml() 方法
具体时间设定可参考
"0/10 * * * * ?" 每10秒触发
"0 0 12 * * ?" 每天中午12点触发 
"0 15 10 ? * *" 每天上午10:15触发 
"0 15 10 * * ?" 每天上午10:15触发 
"0 15 10 * * ? *" 每天上午10:15触发 
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 
"0 15 10 15 * ?" 每月15日上午10:15触发 
"0 15 10 L * ?" 每月最后一日的上午10:15触发 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
0 0 06,18 * * ?  在每天上午6点和下午6点触发 
0 30 5 * * ? *   在每天上午5:30触发
0 0/3 * * * ?    每3分钟触发

windows 服务实现定时任务调度(Quartz.Net)相关推荐

  1. windows 服务实现定时任务调度

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与c#应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个 ...

  2. win服务器自动发邮件,asp.net基于windows服务实现定时发送邮件的方法

    本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法.分享给大家供大家参考,具体如下: //定义组件 private System.Timers.Timer time; publi ...

  3. C#创建windows服务并定时执行

    一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...

  4. [译]Java定时任务调度-Quartz文档(十)Configuration, Resource Usage and SchedulerFactory

    Quartz的设计是模块化的,所以要让它跑起来,得将各个模块组合起来使用.幸运的是,有些工具可以来帮我们做这些事. Quartz的主要模块有: ThreadPool,线程池 JobStore,任务仓库 ...

  5. Windows 服务入门指南

    有很多时候,我们需要创建Windows Service. 这篇文章可以算是一个入门指南吧,希望对初学者有帮助. 要创建Windows Service, 首先选择Windows服务项目,如下图: 这里我 ...

  6. 使用windows服务更新站点地图

    由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象.为减轻数据库压力,我上个月对公司项目做了下调整.把新闻板块提取出来单独一个站点,单独一个数据库.减少了主站点和数据库的负担和压力. ...

  7. Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度 Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quar

    Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度 Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quartz ...

  8. 控制台基于Quartz.Net组件实现定时任务调度(一)

    前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...

  9. Spring+Quartz定时任务调度

    Spring+Quartz定时任务调度   2011/5 zqhxuyuan@gmail.com 参考文章: http://www.iteye.com/topic/399980 ­ org.sprin ...

最新文章

  1. MongoDB日志切换(Rotate Log Files)指南
  2. native react ssh_React Native踩坑笔记(持续更新中...)
  3. linux ftrace原理
  4. java调度:(一)几种任务调度的 Java 实现方法与比较
  5. linux进程间的通信(C): 共享内存
  6. 使用WITH AS提高性能简化嵌套SQL
  7. 给出如下公式的python表达式7+9i+2xcos66_这100道练习,带你玩转Numpy
  8. 第二章 如何在VS2008里面编译CG
  9. 针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)...
  10. 蓝桥杯2015年第六届C/C++省赛B组第二题-星系炸弹
  11. 还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
  12. vue学习笔记-13-侦听器
  13. OrCAD设计原理图
  14. 夏普电视账号服务器异常,夏普电视故障通病维修案例,你中了几个?
  15. java线程的生命周期(图解)
  16. 分享积分兑换小程序开发制作功能介绍
  17. 汽车通信脉冲电子 100Base-T1 汽车|以太网共模扼流圈
  18. 使用Spark和Pig统计每秒钟微博数量
  19. 商业数据分析【一】概述及职业发展
  20. 登陆淘宝账号,提示证书过期

热门文章

  1. 信用指數旁的星星表示什麼?
  2. 直接通过ADO操作Access数据库(修改版)
  3. Spring Security OAuth2.0_实现分布式认证授权_转发明文token给微服务_Spring Security OAuth2.0认证授权---springcloud工作笔记153
  4. Netty工作笔记0025---SocketChannel API
  5. C#.Net工作笔记016---C#中使用反射对两个对象copy复制内容
  6. 杭电1411 校庆神秘建筑
  7. fastadmin 后台view data-source关联报500错误问题
  8. C++ unsigned long 转化为 unsigned char*
  9. cocos2d-x之猜数字游戏
  10. java中文件选择器JFileChooser的用法