自写插件,只需要System内置的Timer,自写的原因不会用别人的(滑稽)。
using System;
namespace DAO.Tools
{
public class Timingtask
{
System.Timers.Timer timer = new System.Timers.Timer();
private Action action;
private bool First = true;
public Timingtask(DateTime Time, Action action)
{
this.action = action;
timer.Enabled = true;
if ((Time - DateTime.Now).TotalMilliseconds < 0) Time= Time.AddDays(1);//指定时间以超过当前时间,那就第二天指定时间执行
timer.Interval = (Time - DateTime.Now).TotalMilliseconds;//Interval单位:毫秒
Console.WriteLine(timer.Interval + "后执行第一次任务");
timer.Start();
timer.Elapsed += new System.Timers.ElapsedEventHandler(DoTask);
}
/// <summary>
/// 任务,那两个参数是语法,没有深入研究,可以参考https://zhidao.baidu.com/question/623758296841099764.html
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DoTask(object sender, System.Timers.ElapsedEventArgs e)
{
if (First)
{
First = false;
timer.Interval = 86400000;//当完成第一次任务后,就每隔一天执行一次
}
action();
}
}
}
然后在程序入口(Program.cs)或者Startup.cs中调用,建议在Startup.cs调用,好获取appsettings.json或其他配置参数,根据个人需要配置,这只是个简单小插件,可以随意扩展。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());
});
#region 定时任务
//每天的16:00执行任务,用Today或者明天后的时间的。
new Timingtask(DateTime.Today.AddHours(16).AddMinutes(0), () =>
{
//要执行的任务
});
#endregion
}
设计思路:假如每天凌晨更新00:00执行任务,程序启动于20:30,还有三个半钟开始第一次任务,计时器设置每隔12600000毫秒执行一次任务,当完成第一次任务后任务间隔改成86400000毫秒(24小时),之后每天指定时间执行任务。
请教:IIS怎么关掉休眠机制(服务器过一段时间没请求会自动休眠),休眠会导致这个定时任务停掉,我想解决这个问题,有好解决方案的朋友评论告诉我。
网友评论