我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到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)的更多相关文章

  1. asp.net基于windows服务实现定时发送邮件的方法

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

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

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

  3. C#基于Quartz.NET实现任务调度并部署Windows服务

    一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp ...

  4. Windows服务 + Quartz.NET

    服务基础 安装管理员打开cmd cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 InstallUtil.exe Path_WinSvc.exe 或者 ...

  5. 不用写Windows服务实现定时器功能(FluentScheduler )

    MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...

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

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

  7. [转]C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe

    写在前面 原文地址:C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe 这篇文章躺在我的收藏夹中有很长一段时间了,今天闲着没事,就自己动手实践了一下.感觉 ...

  8. Windows 服务入门指南

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

  9. Quartz任务调度 服务日志+log4net打印日志+制作windows服务

    引言 现在许多的项目都需要定时的服务进行支撑,而我们经常用到的定时服务就是Quartz任务调度了.不过我们在使用定时Job进行获取的时候,有时候我们就需要记录一下自定义的日志,甚至我们还会对执行定时J ...

随机推荐

  1. 晚上打开eclipse时碰到这个问题 :Workspace in use or cannot be created, choose a different one.

    晚上打开eclipse时碰到这个问题 :Workspace in use or cannot be created, choose a different one. 网上看到这方面的解决方式: 原因: ...

  2. Cobalt Strike深入使用

    System Profiler使用 System Profiler 模块,搜集目标的各类机器信息(操作系统版本,浏览器版本等) Attacks->web drive-by->System ...

  3. 通过HttpClient调用服务

    /** * 通过HttpClient调用服务 * * @param url 路径 * data json数据 * @return */ //post请求方法public String sendItsm ...

  4. Python 函数(一)

    Python3 函数(基本概念) 1.概念: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段:通过函数,可以对特定功能的代码进行封装,实现代码的复用. 2. 5.参数传递 (1) P ...

  5. Android应用安全之数据传输安全

    Android软件通常使用WIFI网络与服务器进行通信.WiFi并非总是可靠的,例如,开放式网络或弱加密网络中,接入者可以监听网络流量:攻击者可能 自己设置WIFI网络钓鱼.此外,在获得root权限后 ...

  6. Remote 桌面的win2003 servre端设定

    Microsoft Windows [版本 5.2.3790](C) 版权所有 1985-2003 Microsoft Corp. C:\Documents and Settings\Administ ...

  7. mfc CListBox

    通过ID操作对象 CListBox(列表框)控件 CListBox类常用成员 CListBox插入数据 CListBox删除数据 CListBox运用示例 一.CListBox类常用成员 CListB ...

  8. 微信小程序 倒计时

    这两天在看微信小程序,参考了网上的资料,做了一个倒计时的练习,记录如下. 本文作者:罗兵 原地址:https://www.cnblogs.com/hhh5460/p/9981064.html 0.效果 ...

  9. 阿里云OSS不同账号之间的迁移

    目录 一.需求说明 二.Ossimport概述 三.配置运行环境 1.配置jdk环境 2.部署方式 3.下载并部署ossimport 四.修改单机Job的配置文件local_job.cfg 五.执行迁 ...

  10. centos 6.5 搭建开源堡垒机 Teleport 遇到的问题解决

    几款开源的堡垒机 下面进行 teleport 的安装: https://docs.tp4a.com/install/#11 异常1:libc.so.6: version `GLIBC_2.14' no ...