惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
Stack Overflow Blog
Stack Overflow Blog
B
Blog
I
InfoQ
GbyAI
GbyAI
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
F
Full Disclosure
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
T
Tailwind CSS Blog
S
Secure Thoughts
P
Privacy International News Feed
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LINUX DO - 最新话题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
Last Week in AI
Last Week in AI
W
WeLiveSecurity
Google Online Security Blog
Google Online Security Blog
P
Privacy & Cybersecurity Law Blog
D
DataBreaches.Net
Engineering at Meta
Engineering at Meta
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Project Zero
Project Zero
V2EX - 技术
V2EX - 技术
H
Heimdal Security Blog
博客园 - Franky
阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Troy Hunt's Blog
V
Vulnerabilities – Threatpost
H
Help Net Security
Martin Fowler
Martin Fowler
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
博客园 - 【当耐特】

博客园 - -Enchant

Linux上搭建Asp.net MVC3环境(CentOS + Nginx + Mono) 《单例模式》你需要注意的问题 系统框架整理 Extjs prompt 显示密码框 Python网页抓取、模拟登录 单点登录(SSO)的一点思考 Jquery以JSON方式调用WebService WCF初探 关于抓取百度搜索内容 iPhone开发环境搭建(备忘) SMTP/POP3命令简介(转) Asp.net MVC2学习笔记索引 Oracle 调优 Oracle常见错误 @OutputCache指令参数 关于ACL权限控制【ASP.NET MVC2】 c#递归生成XML ASP.NET MVC2 Ajax返回JSON 引用类型的对象复制(浅复制和深复制)
C/S模式下 简单的定时任务功能
-Enchant · 2010-08-07 · via 博客园 - -Enchant

最近一个 c/s项目中需要用到定时任务,也就是说每天定时几点给客户发送短信的功能。

思考过后,最后决定这么设计。。。。

由于是定时任务,不是间隔多少时间来执行,所以需要计算定时的时间和当前时间相差毫秒数,然后就可以设置Timer的Interval了,

该任务是每天执行,所以也可以简单的处理了

1、首先抽象出定时任务类:AbstractTask

  属性          Cron:定时的时间,如 10:00:00

         TaskName:任务名称 

        NextTime:任务下次执行时间

  主要方法  Start()     : 开始任务

        Stop()     :停止任务

      abstract Run() :抽象的run方法供子类覆写 来实现自己任务功能

详细代码如下:

代码

1 using System;
2  using System.Collections.Generic;
3  using System.Text;
4
5  namespace TaskCenter
6 {
7 /// <summary>
8 /// 定时任务抽象类
9 /// </summary>
10   public abstract class AbstractTask
11 {
12 private string cron = "10:00:00";//定时时间 时:分:秒
13   private string taskName = "NoName";
14 private System.Timers.Timer timer = new System.Timers.Timer();
15 #region 一些属性
16 /// <summary>
17 /// 获取或设置该任务名称
18 /// </summary>
19   public string TaskName
20 {
21 get { return taskName; }
22 set { taskName = value; }
23 }
24 private DateTime nextTime = new DateTime();
25
26 /// <summary>
27 /// 取得任务下次执行时间
28 /// </summary>
29   public DateTime NextTime
30 {
31 get { return nextTime; }
32 //set { nextTime = value; }
33   }
34 /// <summary>
35 /// 设置任务执行时间,默认 10:00:00
36 /// 如果时间格式出错,使用默认值
37 /// </summary>
38   public string Cron
39 {
40 get { return cron; }
41 set
42 {
43 //TODO:判断是否有效
44   DateTime tmp;
45 if (DateTime.TryParse(value, out tmp))
46 {
47 cron = value;
48 }
49 }
50 }
51 #endregion
52
53 /// <summary>
54 /// 停止任务
55 /// </summary>
56   public void Stop()
57 {
58 if (timer != null)
59 {
60 timer.Stop();
61 timer.Enabled = false;
62 }
63 }
64
65 /// <summary>
66 /// 开始执行任务
67 /// </summary>
68   public void Start()
69 {
70 ProcessTaskTime();
71 }
72
73 /// <summary>
74 /// 处理下次执行任务的时间
75 /// </summary>
76   private void ProcessTaskTime()
77 {
78 double interval = 0;
79 //解析时间 并 设置 timer 间隔时间
80   if (!"".Equals(Cron))
81 {
82 DateTime execDateTime = ExecTime(cron);//任务执行时间
83   Console.WriteLine(string.Format("任务:[{0}] 下次执行时间:{1}",taskName,execDateTime.ToString()));
84 interval = (execDateTime - DateTime.Now).TotalMilliseconds;
85 timer.Interval = interval;
86 timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
87 timer.Enabled = true;
88 }
89 }
90
91 //计算下次执行时间
92   private DateTime ExecTime(string str)
93 {
94 DateTime dt = new DateTime();
95 try
96 {
97 //dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,
98 // Int32.Parse(strs[0]), Int32.Parse(strs[1]), Int32.Parse(strs[2]));
99 dt = DateTime.Parse(str);
100 DateTime dtNow = DateTime.Now;
101
102 //判断今天能否执行
103 TimeSpan ts = dtNow - dt;
104 if (ts.TotalMilliseconds > 0)
105 {
106 //今天已经过了执行时间了,只能明天了
107 dt = dt.AddDays(1);
108 }
109 nextTime = dt;
110 }
111 catch
112 { }
113 return dt;
114 }
115
116 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
117 {
118 ProcessTaskTime();
119 Run();
120 }
121
122 /// <summary>
123 /// 定时任务主入口
124 /// </summary>
125 protected abstract void Run();
126 }
127 }
128

2、新建一个定时任务类 TaskTest 继承AbstractTask抽象类

代码

1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace TaskCenter
6 {
7 public class TaskTest:AbstractTask
8 {
9 protected override void Run()
10 {
11 Console.WriteLine("=====这里执行了自己的任务!=====");
12 }
13 }
14 }
15

3、测试任务执行

   只需要实例化定时任务类,执行它的 Start方法即可。。

代码

1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8
9 namespace TaskCenter
10 {
11 public partial class Form1 : Form
12 {
13 public Form1()
14 {
15 InitializeComponent();
16 }
17
18 private void Form1_Load(object sender, EventArgs e)
19 {
20 AbstractTask task = new TaskTest();
21 task.TaskName = "测试的定时任务";
22 task.Cron = "20:31:00";//定时时间,每天执行
23
24 task.Start();
25 }
26 }
27 }
28

项目启动以后就可以看到

任务:[测试的定时任务] 下次执行时间:2010/8/7 20:31:00
任务:[测试的定时任务] 下次执行时间:2010/8/8 20:31:00
=====这里执行了自己的任务!=====

好了,到此为止,一个简单的定时任务程序搞定了,后续还可以继续优化,将定时任务的时间改成多种形式,类似于linux中的cron,呵呵

到时候只需要修改 抽象类中的 ExecTime方法,让他根据不同的条件 计算出下次执行的时间即可。

最后还可以加一个调度中心来管理这些定时任务。。。。。。