asp.net下实现可以将计划任务的方法放在global里,使用一个统一的任务管理类来管理各种任务的执行,做到并行不悖!
下面是我写的一个方法,希望起个抛砖引玉的作用!大家一起学习下:
第一步定义一个接口,用来规范任务必须要实现的动作,该接口只有一个方法(简单起见):
复制代码 代码如下:
/// <summary>
/// 工作单元接口,定义一个计划任务必须完成的工作
/// </summary>
public interface IScheduledTask
{
/// <summary>
/// 任务执行
/// </summary>
void Execute();
}
第二步,定义一个类,用来管理计划任务的执行和关闭:
复制代码 代码如下:
/// <summary>
/// 用来执行计划任务的基本对象
/// </summary>
public class ScheduledTask
{
private static readonly ScheduledTask _ScheduledTask = null;
private Timer UpdateTimer = null;
/// <summary>
/// 间隔时间,单位为毫秒
/// </summary>
private int interval = 10 * 1000;
/// <summary>
/// 间隔时间,单位为毫秒
/// </summary>
public int Interval
{
get { return this.interval; }
set { this.interval = value; }
}
/// <summary>
/// 任务是否完成标志
/// </summary>
private int _IsRunning;
/// <summary>
/// 静态构造函数,保证实例的唯一性
/// </summary>
static ScheduledTask()
{
_ScheduledTask = new ScheduledTask();
}
/// <summary>
/// 任务队列
/// </summary>
private ArrayList tasks = new ArrayList();
/// <summary>
/// 任务队列
/// </summary>
public ArrayList Tasks { get { return tasks; } }
/// <summary>
/// 返回任务实例
/// </summary>
/// <returns></returns>
public static ScheduledTask Instance()
{
return _ScheduledTask;
}
/// <summary>
/// 执行任务
/// </summary>
public void Start()
{
if (UpdateTimer == null)
{
UpdateTimer = new Timer(new TimerCallback(UpdateTimerCallback), null, interval, interval);
}
}
/// <summary>
/// 任务处理
/// </summary>
/// <param name="sender"></param>
private void UpdateTimerCallback(object sender)
{
if (Interlocked.Exchange(ref _IsRunning, 1) == 0)
{
try
{
//执行多个任务
foreach (IScheduledTask task in Tasks)
{
ThreadStart myThreadDelegate = new ThreadStart(task.Execute);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
}
}
catch (Exception ex)
{
//错误处理
CreateLog(ex.Message, true);
}
finally
{
Interlocked.Exchange(ref _IsRunning, 0);
}
}
}
/// <summary>
/// 取消任务
/// </summary>
public void Stop()
{
if (UpdateTimer != null)
{
UpdateTimer.Dispose();
UpdateTimer = null;
}
}
/// <summary>
/// 记录日志至文本文件
/// </summary>
/// <param name="message"></param>
/// <param name="iserror"></param>
public static void CreateLog(string message, bool iserror)
{
DateTime dt = DateTime.Now;
int y = dt.Year;//当前的年份
int m = dt.Month;//当前的月份
string root = HttpRuntime.AppDomainAppPath;
root += "ScheduledTaskLogs";
if (!File.Exists(root)) Directory.CreateDirectory(root);
string dir_y = root + "\\" + y.ToString();
string dir_m = dir_y + "\\" + m.ToString();
string err = iserror ? "_taskerror" : "_task";
string dirOk = dir_m + "\\" + dt.Year + dt.Month + dt.Day + err + ".txt";
//以当前年份为名创建新目录
if (!File.Exists(dir_y)) Directory.CreateDirectory(dir_y);
//以当前月份为名创建新目录
if (!File.Exists(dir_m)) Directory.CreateDirectory(dir_m);
string err1 = iserror ? "错误" : "";
if (File.Exists(dirOk))
{
StreamWriter sr = new StreamWriter(dirOk, true, Encoding.Default);
lock (sr)
{
sr.WriteLine();
sr.WriteLine("--------------计划任务" + err1 + "日志-----------------------------------------------------------------------");
sr.WriteLine(err1 + "时间: " + DateTime.Now.ToString());
sr.WriteLine("详细内容: " + message);
sr.WriteLine("--------------------------------------------------------------------------------------------");
}
sr.Close();
sr.Dispose();
}
else
{
StreamWriter sr = new StreamWriter(dirOk, false, Encoding.Default);
lock (sr)
{
sr.WriteLine();
sr.WriteLine("--------------计划任务" + err1 + "日志-----------------------------------------------------------------------");
sr.WriteLine(err1 + "时间: " + DateTime.Now.ToString());
sr.WriteLine("详细内容: " + message);
sr.WriteLine("--------------------------------------------------------------------------------------------");
}
sr.Close();
sr.Dispose();
}
}
}
第三步,定义要做的动作处理类,继承第一步定义的接口,下面的例子是一个定时邮件发送程序,在规定的时间段执行邮件发送:
复制代码 代码如下:
/// <summary>
/// 计划任务--定时发送邮件
/// </summary>
public class Task_MailSend : IScheduledTask
{
public void Execute()
{
string nw = DateTime.Now.ToString("HH");
int hh = 0;
if (!Int32.TryParse(nw, out hh)) { return; }
//每天11-13点发送邮件
if (hh < 10 || hh > 17)
{
ScheduledTask.CreateLog("没到发送时间", true);
return;
}
DataTable dt = GetOrderedUser();
int num = dt.Rows.Count;
if (num == 0)
{
ScheduledTask.CreateLog("目前没有用户订阅", true);
return;
}
/*
mail发送程序。。。
*/
}
好了,执行上面三步后,剩下的工作就交给global来做了!
复制代码 代码如下:
<script runat="server"><!--
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
//WildRen.Common是我这里的命名空间
WildRen.Common.ScheduledTask.Instance().Interval = 12 * 60 * 60000;//设置计划任务执行时间间隔
WildRen.Common.ScheduledTask.Instance().Tasks.Add(new Task_MailSend());//向计划任务管理程序添加要执行的动作
WildRen.Common.ScheduledTask.Instance().Start();//启动任务
}
void Application_End(object sender, EventArgs e)
{
// 在应用程序关闭时运行的代码
WildRen.Common.ScheduledTask.Instance().Stop();
}
// --></script>
如果使用ajax连接此管理类模拟客户端timer事件经行处理也是可以的!当然方法不是唯一的,此程序可能存在一些不足之处,欢迎大家指正!
相关推荐:
ChatGPT3.5需要登录使用吗?AI使用的真相!,电脑版写作ai推荐怎么关闭
“更加通顺”-让生活与工作无缝衔接的语言魅力,SEO书架书桌收纳
AI提炼主要内容:如何让信息更精准、高效、易懂,女军人ai
OpenPose大白话解释:让你轻松理解姿态识别的神奇技术,ai天天晴
SEO通过-如何通过SEO优化让你的业务在搜索引擎中脱颖而出,保定网站建设推广专家
seo项目是什么,seo是啥 ,ai ued
SEO占位:如何在竞争激烈的市场中占得先机?,梁平区省心全网营销推广
什么是亚马逊seo策略,亚马逊的seo推广是什么 ,天天学术ai写作优惠券
用AI优化文章,轻松提升内容质量与创作效率
Goanno跨级借鉴:推动创新与提升效率的秘密武器,崇明区智能ai艾灸费用
互联网快照:记录数字时代的每个瞬间,全网seo怎么优化内容
AI网页设计生成-智能化创造无限可能,ai机甲风背景音乐
ChatGPT充值打不开?这几招教你轻松解决问题!,免费的ai写作绘图
SEO有话:如何用精准优化助力企业在线增长,食品微信营销推广
SEO优:让网站流量和排名实现飞跃的秘诀,大理哪有企业网站建设
SEO希望:如何通过SEO优化实现网站突破,迈向成功之路,品牌网站推广软件
主流seo是什么,seo是什么推广网站 ,AI心理师
什么叫改写-解读“改写”背后的艺术与技巧,网站制作建设模板图片
SEO快速优化技术:助力网站流量暴增,轻松登顶搜索引擎,铜陵ai全网通推广软件
SEO立刻:快速提升网站排名,带你走在搜索引擎前沿,网站建设怎么推广好做
内容创作新时代:自动生成文章的AI如何改变写作生态
seo网站关键字排名优化,网站seo关键词 ,运动ai
SEO管家:为您的网站保驾护航的智能SEO助手,网站推广作用有哪些类型
亚马逊seo是什么公司的,“亚马逊” ,ai玩底特律
seo网站是什么东西,seo网站是什么东西啊 ,ai锯齿消失
SEO符合:提升网站排名的秘诀,助力企业赢在搜索引擎优化的赛道,优化没续费 网站没了
SEO表格:优化网站排名的秘密武器,大数据推广营销费用多少
seo系列什么意思,seo的分类 ,que n ai je
ChatGPT:基于Transformer技术的语言模型,开创人工智能未来,AI独战OK
企业SEO:如何通过搜索引擎优化提升企业网络竞争力,安阳网站优化布局设计
ChatGPT页面无法翻阅?带你深度了解背后的原因与解决方案,pdf怎么转换ai文字
用AI写的文章算原创吗?真相揭示,带你深度思考!
SEO优化流程:助力网站快速提升排名的关键策略,1745ai
SEO前的准备工作:如何让网站为搜索引擎优化做好充分准备,SEO_网站排名优化_网络推广
SEO优化中怎么找关键词:全面解析与实战技巧,ai2002.4.8
GPT哪个模型是最新的?AI语言生成的未来,ai回头
二级泛站群,zblog二级泛站群 ,李宗盛ai
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
SEO观察:2025年搜索引擎优化的新趋势与机遇,seo2是什么状态
优化工具:提升工作效率的秘密武器,网站模板的优化策略是什么
ChatGPT付款银行卡被拒绝?解决方案全解析!,小发猫ai智能写作查重能过吗
ChatGPT页面空白无法登录?如何解决这一困扰?,温州ai字幕生成
好用的AI写作工具,提升写作效率与创意的最佳选择
企业关键字-助力企业成功的隐形动力,闽侯县企业网站建设
二创AI:打破创意壁垒,引领未来内容创作新潮流,背影教案网站建设游戏
ChatGPT支持多种语言输入输出,让全球资讯触手可及,联想拯救者的ai写作
ChatGPT显示503:如何应对AI服务不可用的困境?,ai宝贝宝贝
为什么seo这么难,seo难嘛 ,ai宁中则
什么是seo如何进行seo,何谓seo ,红米的AI摄影什么意思
优化网站的秘诀:提高网站速度与用户体验,助力业务腾飞,旅游网站建设步骤