場景二:朋友明天過生日,我今天先把郵件寫了,定時明天幾點幾分幾秒發送,如何做?
基於以上問題,我們自己實現一個小小的定時器,現在分解一下,可以使用在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秒後開始執行任務,完整的源碼在後面可以下載