C#實現一個簡單的定時任務
阿新 • • 發佈:2019-02-09
場景一:微博、微信、郵件等需要定時傳送時,怎麼辦?
呼叫:
再定義一個執行完的回撥函式:
再定義這兩個函式 的入參就可以了,都在同一頁面中,
場景二:朋友明天過生日,我今天先把郵件寫了,定時明天幾點幾分幾秒傳送,如何做?
基於以上問題,我們自己實現一個小小的定時器,現在分解一下,可以使用在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秒後開始執行任務,完整的原始碼在後面可以下載