C#实现一个简单的定时任务

时间:2022-04-08 23:28:32
场景一:微博、微信、邮件等需要定时发送时,怎么办?

场景二:朋友明天过生日,我今天先把邮件写了,定时明天几点几分几秒发送,如何做?

基于以上问题,我们自己实现一个小小的定时器,现在分解一下,可以使用在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秒后开始执行任务,完整的源码在后面可以下载



点击下载源码