using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Threading; /// <summary> /// 計劃任務代理 /// </summary> public delegate void TaskSchedulerHandler(); public enum TaskSchedulerRule { Second, Minute, Hour, Day, Week, Month, Year } /// <summary> /// 任務執行間隔 /// 負責計算下一次執行任務的時間 /// </summary> public class TaskSpan { public TaskSchedulerRule Rule = TaskSchedulerRule.Day; private DateTime _TaskTime = DateTime.Now; public DateTime TaskTime { get { return _TaskTime; } set { if (value < DateTime.Now) { value = DateTime.Now; } _TaskTime = value; } } public DateTime _NextTaskTime; public DateTime NextTaskTime { get { if (_NextTaskTime > TaskTime) { return _NextTaskTime; } return Next(); } } private Int32 _Number = 1; public Int32 Number { get { return _Number; } set { if (value < 1) { value = 1; } _Number = value; } } public TaskSpan(TaskSchedulerRule rule, Int32 number) { this.Rule = rule; this.Number = number; } public TaskSpan() : this(TaskSchedulerRule.Day, 1) { } public void BeginNext() { TaskTime = NextTaskTime; } public DateTime Next() { _NextTaskTime = TaskTime; switch (this.Rule) { case TaskSchedulerRule.Week: _NextTaskTime.AddDays(this.Number * 7); break; default: this._NextTaskTime = (DateTime)typeof(DateTime).GetMethod(String.Format("Add{0}s", this.Rule)).Invoke(this._NextTaskTime, new Object[] { Number }); break; } return this._NextTaskTime; } } /// <summary> /// 計劃任務實體 /// 包含要執行的方法及執行區間 /// </summary> public class TaskScheduler { public Boolean Removed; public String TaskName; public TaskSpan Span; public event TaskSchedulerHandler TaskSchedulerEvent; public TaskScheduler(String name, TaskSchedulerHandler action, TaskSpan span) { this.TaskName = name; this.Span = span; this.TaskSchedulerEvent += action; } public void Run() { TaskSchedulerEvent(); } } /// <summary> /// 計劃任務管理器 /// </summary> public class TaskSchedulerManager { public static Object locker = new Object(); private static TaskSchedulerManager _Instance; Dictionary<String, TaskScheduler> TaskSchedulers = new Dictionary<String, TaskScheduler>(); Dictionary<String, List<TaskScheduler>> TaskCollections = new Dictionary<String, List<TaskScheduler>>(); private List<TaskScheduler> TaskListItems; private String TaskListKey; bool Runing = false; public static TaskSchedulerManager GetInstance() { if (_Instance == null) { lock (locker) { if (_Instance == null) { _Instance = new TaskSchedulerManager(); } } } return _Instance; } /// <summary> /// 新增計劃任務 /// </summary> /// <param name="task">計劃任務實體</param> public void AddTask(TaskScheduler task) { AddTask(task, false); } /// <summary> /// 新增計劃任務 /// </summary> /// <param name="task">計劃任務實體</param> /// <param name="start">是否當即開始</param> public void AddTask(TaskScheduler task, Boolean start) { TaskSchedulers.Add(task.TaskName, task); if (start) { task.Span.TaskTime = DateTime.Now; task.Run(); task.Span.BeginNext(); } InitTask(task); } /// <summary> /// 移除計劃任務 /// </summary> /// <param name="task">計劃任務實體</param> public void RemoveTask(TaskScheduler task) { TaskSchedulers.Remove(task.TaskName); foreach (string key in TaskCollections.Keys) { TaskCollections[key].Remove(task); } } /// <summary> /// 移除計劃任務 /// </summary> /// <param name="name">計劃任務名稱</param> public void RemoveTask(string name) { foreach (string key in TaskCollections.Keys) { TaskCollections[key].Remove(TaskSchedulers[name]); } TaskSchedulers.Remove(name); } /// <summary> /// 清除全部計劃任務 /// </summary> public void ClearTask() { TaskSchedulers.Clear(); TaskCollections.Clear(); } /// <summary> /// 初始化計劃任務,加入到計劃任務集合中 /// </summary> /// <param name="task"></param> private void InitTask(TaskScheduler task) { TaskListKey = task.Span.TaskTime.ToString("yyyyMMddHHmmss"); if (TaskCollections.ContainsKey(TaskListKey)) { TaskListItems = TaskCollections[TaskListKey] as List<TaskScheduler>; TaskListItems.Add(task); } else { TaskCollections.Add(TaskListKey, TaskListItems = new List<TaskScheduler> { task }); } } /// <summary> /// 運行計劃任務 /// </summary> /// <param name="tasks">tasks</param> private void RunTask(List<TaskScheduler> tasks) { for (int i = 0; i < tasks.Count; i++) { TaskScheduler task = tasks[i]; tasks[i] = null; new Thread(task.Run).Start(); task.Span.BeginNext(); InitTask(task); } } /// <summary> /// 啓動運行計劃任務管理 /// </summary> public void Run() { Object _locker = new Object(); Runing = true; string key; while (Runing) { Thread.Sleep(1000); lock(_locker) { key = DateTime.Now.ToString("yyyyMMddHHmmss"); if (TaskCollections.ContainsKey(key.ToString())) { RunTask(TaskCollections[key]); TaskCollections.Remove(key); } } } } /// <summary> /// 中止計劃任務管理 /// </summary> public void Stop() { Runing = false; } }
演示代碼:this
public partial class Pages_Begin : System.Web.UI.Page { public String Message { get { return String.Format("顯示時間爲:{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now); } } protected void Page_Load(object sender, EventArgs e) { #region 能夠循環部分 //建立計劃任務 TaskScheduler task = new TaskScheduler("TaskMethod", TaskMethod, new TaskSpan(TaskSchedulerRule.Second, 5) { TaskTime = DateTime.Now.AddSeconds(10) }); //將計劃任務併入到管理中 TaskSchedulerManager.GetInstance().AddTask(task, true); //建立計劃任務 TaskScheduler task2 = new TaskScheduler("TashMethod2",TaskMethod2, new TaskSpan(TaskSchedulerRule.Second, 10) { TaskTime = DateTime.Now.AddSeconds(10) }); //將計劃任務併入到管理中 TaskSchedulerManager.GetInstance().AddTask(task2, false); #endregion //啓用計劃任務管理 TaskSchedulerManager.GetInstance().Run(); } public void TaskMethod() { FileStream fs = new FileStream(Server.MapPath("~/File/TextFile.txt"), FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(Message); sw.Close(); sw.Dispose(); fs.Close(); fs.Dispose(); } public void TaskMethod2() { FileStream fs = new FileStream(Server.MapPath("~/File/TextFile2.txt"), FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(Message); sw.Close(); sw.Dispose(); fs.Close(); fs.Dispose(); } }