1. 程式人生 > >C#實現一個簡單的定時任務

C#實現一個簡單的定時任務

場景一:微博、微信、郵件等需要定時傳送時,怎麼辦?

場景二:朋友明天過生日,我今天先把郵件寫了,定時明天幾點幾分幾秒傳送,如何做?

基於以上問題,我們自己實現一個小小的定時器,現在分解一下,可以使用在WinForm、Web等程式中

首先建一個類TaskTime,繼承於.net中的System.Timers.Timer, 再建一個帶引數的建構函式TaskTime,如下:

完整的原始碼在後面可以下載

public class TaskTime : System.Timers.Timer
    {
        /// <summary>
        /// 構造
        /// </summary>
        /// <param name="executeTime">定時什麼時候傳送</param>
        /// <param name="action">要執行什麼任務,這是一個委託,string[]是引數,當然也可以用模型</param>
        /// <param name="actionArgs">要執行任務的引數,與action的引數相對應</param>
        /// <param name="callback">執行完的回撥函式</param>
        /// <param name="callbackArgs">回撥函式的引數,與回撥函式裡的引數型別相對應</param>
        public TaskTime(DateTime executeTime, Action<string[]> action,string[] actionArgs, Action<string[]> callback, string[] callbackArgs)
        {
            double interval = (executeTime - DateTime.Now).TotalMilliseconds;
            //這裡做下限制,不能超過最大值
            if (interval >= int.MaxValue)
            {
                throw new ArgumentOutOfRangeException("不能超過最大值24天!");
            }
            base.Elapsed += (obj, e) => action(actionArgs);
            base.Elapsed += (obj, e) => callback(callbackArgs);
            base.AutoReset = false; //TODO: 迴圈執行暫不支援
            base.Interval = interval > 0 && interval < int.MaxValue ? interval : 100;
            base.Enabled = true;
        }
    }

呼叫:

這裡測試是在主程式裡進行,為了省事,做簡單演示,

定義所需要的函式和引數

定義要執行的任務的函式:

/// <summary>
        /// 要執行的任務
        /// </summary>
        /// <param name="strarr">這裡的入參我傳的是陣列,你完全可以傳入的一個包含很多屬性值的物件</param>
        private static void ActionTask(string[] strarr)
        {
            int taskId = 0;
            if (strarr.Length>0)
            {
                int.TryParse(strarr[0],out taskId);
            }
            try
            {
                //任務完成
                Console.WriteLine("發任務:" + taskId);
            }
            catch (Exception)
            {
                throw;
            }
        }

再定義一個執行完的回撥函式:
/// <summary>
        /// 任務執行完畢的操作
        /// </summary>
        /// <param name="args">這裡同樣可以傳入物件,用作處理</param>
        private static void CallBackFun(string[] strarr)
        {
            int taskId = 0;
            if (strarr.Length > 0)
            {
                int.TryParse(strarr[0], out taskId);
            }
            try
            {
                //任務完成
                Console.WriteLine("任務傳送結束,這是執行的回撥函式:" + taskId);
            }
            catch (Exception)
            {
                throw;
            }
        }

再定義這兩個函式 的入參就可以了,都在同一頁面中,
string[] strArr = new string[] {"11","22","33","44","55" };
string[] strArr2 = new string[] { "66", "77", "88", "99" };
主程式中這樣直接對建構函式寫入引數即可。
static void Main(string[] args)
        {
            string[] strArr = new string[] {"11","22","33","44","55" };
            string[] strArr2 = new string[] { "66", "77", "88", "99" };
            TaskTime t = new TaskTime(DateTime.Now.AddSeconds(5), ActionTask, strArr, CallBackFun, strArr2);
            Console.ReadKey();
            return;
        }


其中, DateTime.Now.AddSeconds(5),是5秒後開始執行任務,完整的原始碼在後面可以下載