C#全局計劃任務類

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();
    }
}
相關文章
相關標籤/搜索