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秒後開始執行任務,完整的源碼在後面可以下載



點擊下載源碼



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章