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

时间:2021-12-12 02:37:23
场景一:微博、微信、邮件等需要定时发送时,怎么办?

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

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



点击下载源码