场景二:朋友明天过生日,我今天先把邮件写了,定时明天几点几分几秒发送,如何做?
基于以上问题,我们自己实现一个小小的定时器,现在分解一下,可以使用在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秒后开始执行任务,完整的源码在后面可以下载