无为清净楼资源网 Design By www.qnjia.com
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事件经行处理也是可以的!当然方法不是唯一的,此程序可能存在一些不足之处,欢迎大家指正!
下面是我写的一个方法,希望起个抛砖引玉的作用!大家一起学习下:
第一步定义一个接口,用来规范任务必须要实现的动作,该接口只有一个方法(简单起见):
复制代码 代码如下:
/// <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事件经行处理也是可以的!当然方法不是唯一的,此程序可能存在一些不足之处,欢迎大家指正!
标签:
asp.net,计划任务
无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】