时间:2021-07-01 10:21:17 帮助过:12人阅读
- <br>/// <summary> <br>/// 工作单元接口,定义一个计划任务必须完成的工作 <br>/// </summary> <br>public interface IScheduledTask <br>{ <br>/// <summary> <br>/// 任务执行 <br>/// </summary> <br>void Execute(); <br>} <br> <br><br>第二步,定义一个类,用来管理计划任务的执行和关闭: <br><br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>/// <summary> <br>/// 用来执行计划任务的基本对象 <br>/// </summary> <br>public class ScheduledTask <br>{ <br>private static readonly ScheduledTask _ScheduledTask = null; <br><br>private Timer UpdateTimer = null; <br><br>/// <summary> <br>/// 间隔时间,单位为毫秒 <br>/// </summary> <br>private int interval = 10 * 1000; <br>/// <summary> <br>/// 间隔时间,单位为毫秒 <br>/// </summary> <br>public int Interval <br>{ <br>get { return this.interval; } <br>set { this.interval = value; } <br>} <br>/// <summary> <br>/// 任务是否完成标志 <br>/// </summary> <br>private int _IsRunning; <br><br>/// <summary> <br>/// 静态构造函数,保证实例的唯一性 <br>/// </summary> <br>static ScheduledTask() <br>{ <br>_ScheduledTask = new ScheduledTask(); <br>} <br>/// <summary> <br>/// 任务队列 <br>/// </summary> <br>private ArrayList tasks = new ArrayList(); <br>/// <summary> <br>/// 任务队列 <br>/// </summary> <br>public ArrayList Tasks { get { return tasks; } } <br><br>/// <summary> <br>/// 返回任务实例 <br>/// </summary> <br>/// <returns></returns> <br>public static ScheduledTask Instance() <br>{ <br>return _ScheduledTask; <br>} <br><br>/// <summary> <br>/// 执行任务 <br>/// </summary> <br>public void Start() <br>{ <br>if (UpdateTimer == null) <br>{ <br>UpdateTimer = new Timer(new TimerCallback(UpdateTimerCallback), null, interval, interval); <br>} <br>} <br><br>/// <summary> <br>/// 任务处理 <br>/// </summary> <br>/// <param name="sender"></param> <br>private void UpdateTimerCallback(object sender) <br>{ <br>if (Interlocked.Exchange(ref _IsRunning, 1) == 0) <br>{ <br>try <br>{ <br>//执行多个任务 <br>foreach (IScheduledTask task in Tasks) <br>{ <br>ThreadStart myThreadDelegate = new ThreadStart(task.Execute); <br>Thread myThread = new Thread(myThreadDelegate); <br>myThread.Start(); <br>} <br>} <br>catch (Exception ex) <br>{ <br>//错误处理 <br>CreateLog(ex.Message, true); <br>} <br>finally <br>{ <br>Interlocked.Exchange(ref _IsRunning, 0); <br>} <br>} <br>} <br><br>/// <summary> <br>/// 取消任务 <br>/// </summary> <br>public void Stop() <br>{ <br>if (UpdateTimer != null) <br>{ <br>UpdateTimer.Dispose(); <br>UpdateTimer = null; <br>} <br>} <br><br>/// <summary> <br>/// 记录日志至文本文件 <br>/// </summary> <br>/// <param name="message"></param> <br>/// <param name="iserror"></param> <br>public static void CreateLog(string message, bool iserror) <br>{ <br>DateTime dt = DateTime.Now; <br>int y = dt.Year;//当前的年份 <br>int m = dt.Month;//当前的月份 <br><br>string root = HttpRuntime.AppDomainAppPath; <br><br>root += "ScheduledTaskLogs"; <br><br>if (!File.Exists(root)) Directory.CreateDirectory(root); <br><br>string dir_y = root + "\\" + y.ToString(); <br>string dir_m = dir_y + "\\" + m.ToString(); <br>string err = iserror ? "_taskerror" : "_task"; <br>string dirOk = dir_m + "\\" + dt.Year + dt.Month + dt.Day + err + ".txt"; <br><br>//以当前年份为名创建新目录 <br>if (!File.Exists(dir_y)) Directory.CreateDirectory(dir_y); <br><br>//以当前月份为名创建新目录 <br>if (!File.Exists(dir_m)) Directory.CreateDirectory(dir_m); <br><br>string err1 = iserror ? "错误" : ""; <br><br>if (File.Exists(dirOk)) <br>{ <br>StreamWriter sr = new StreamWriter(dirOk, true, Encoding.Default); <br>lock (sr) <br>{ <br>sr.WriteLine(); <br>sr.WriteLine("--------------计划任务" + err1 + "日志-----------------------------------------------------------------------"); <br>sr.WriteLine(err1 + "时间: " + DateTime.Now.ToString()); <br>sr.WriteLine("详细内容: " + message); <br>sr.WriteLine("--------------------------------------------------------------------------------------------"); <br>} <br>sr.Close(); <br>sr.Dispose(); <br>} <br>else <br>{ <br>StreamWriter sr = new StreamWriter(dirOk, false, Encoding.Default); <br>lock (sr) <br>{ <br>sr.WriteLine(); <br>sr.WriteLine("--------------计划任务" + err1 + "日志-----------------------------------------------------------------------"); <br>sr.WriteLine(err1 + "时间: " + DateTime.Now.ToString()); <br>sr.WriteLine("详细内容: " + message); <br>sr.WriteLine("--------------------------------------------------------------------------------------------"); <br>} <br>sr.Close(); <br>sr.Dispose(); <br>} <br>} <br>} <br> <br>第三步,定义要做的动作处理类,继承第一步定义的接口,下面的例子是一个定时邮件发送程序,在规定的时间段执行邮件发送: <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>/// <summary> <br>/// 计划任务--定时发送邮件 <br>/// </summary> <br>public class Task_MailSend : IScheduledTask <br>{ <br>public void Execute() <br>{ <br>string nw = DateTime.Now.ToString("HH"); <br><br>int hh = 0; <br>if (!Int32.TryParse(nw, out hh)) { return; } <br><br>//每天11-13点发送邮件 <br>if (hh < 10 || hh > 17) <br>{ <br>ScheduledTask.CreateLog("没到发送时间", true); <br>return; <br>} <br><br>DataTable dt = GetOrderedUser(); <br>int num = dt.Rows.Count; <br>if (num == 0) <br>{ <br>ScheduledTask.CreateLog("目前没有用户订阅", true); <br>return; <br>} <br>/* <br><br>mail发送程序。。。 <br>*/ <br>} <br> <br>好了,执行上面三步后,剩下的工作就交给global来做了! <br><br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><script runat="server"><!-- <br><br>void Application_Start(object sender, EventArgs e) <br>{ <br>// 在应用程序启动时运行的代码 <br>//WildRen.Common是我这里的命名空间 <br>WildRen.Common.ScheduledTask.Instance().Interval = 12 * 60 * 60000;//设置计划任务执行时间间隔 <br>WildRen.Common.ScheduledTask.Instance().Tasks.Add(new Task_MailSend());//向计划任务管理程序添加要执行的动作 <br>WildRen.Common.ScheduledTask.Instance().Start();//启动任务 <br>} <br><br>void Application_End(object sender, EventArgs e) <br>{ <br>// 在应用程序关闭时运行的代码 <br>WildRen.Common.ScheduledTask.Instance().Stop(); <br><br>} <br><br>// --></script> <br> <br>如果使用ajax连接此管理类模拟客户端timer事件经行处理也是可以的!当然方法不是唯一的,此程序可能存在一些不足之处,欢迎大家指正!</li><li> </li><li> </li></ol></pre></li></ol></pre></li></ol></pre>