NOP的定时任务也是群里听群友听说,我很少在WEB端做定时任务,所以尝鲜下,看看效果怎么样.
主要涉及到下面几个类和配置文件配置:
web.config
<configSections> <section name="NopConfig" type="StudyCommerceTimerTask.TimerTask.NopConfig,StudyCommerceTimerTask" requirePermission="false"/> <!--请求权限,完全受控制--> </configSections> <connectionStrings> <add name="ConnectionString" connectionString="Data Source=10.1.0.103;Initial Catalog=DHGDP;uid=sa;pwd=dahua123"/> </connectionStrings> <NopConfig> <SqlServer ConnectionStringName="ConnectionString"/> <Cache Enabled="True"/> <ScheduleTasks> <!--1分钟执行一次--> <Thread seconds="60"> <task name="AddDatabase" type="StudyCommerceTimerTask.TimerTask.ThreadTask.AddBase,StudyCommerceTimerTask" enabled="true" stopOnError="false"/> </Thread> </ScheduleTasks> </NopConfig>
其中NopConfig这个节点,里有很多配置。需要注意下:
1.SqlServer 是读取ConnectionString里面的配置链接字符串
2.Cache 是否开启缓存,开启就会从缓存读取,反之亦然
3.enabled是否对当前任务开启执行
4.stopOnError 是否遇见错误,还继续执行
从上面可以看出来,这个计划任务。一个线程可以执行多个任务。 可以执行多个线程。
ITask=>接口类:
这个是最重要的接口,所有的任务都通过实现这个接口,实现反转,开启任务执行。有点像IOC的味道
Task=>任务执行类
切记这个类不是对ITask类的实现类,而是对当前配置的节点的任务进行获取,并进行反射执行和调用里面配置的节点类进行执行任务
public ITask createTask() { if (this.Enabled && (this._task == null)) { if (this._taskType != null) { this._task = Activator.CreateInstance(this._taskType) as ITask; } } return this._task; } public void Execute() { this._isRunning = true; try { var task = this.createTask(); if (task != null) { this._lastStarted = DateTime.Now; task.Execute(this._configNode); this._lastEnd = this._lastSuccess = DateTime.Now; } } catch (Exception exception) { this._enabled = !this.StopOnError; this._lastEnd = DateTime.Now; //throw; } this._isRunning = false; }
上面2个方法,一个是反射 一个是执行反射并更改当前线程任务在执行
TaskThread=>任务线程类
对配置的里面的所有任务加载到线程中,并开始执行
TaskManager=>任务线管理的任务管理
对当前所有的线程任务进行初始化加载和依次执行
Global.aspx.cs=>应用程序启动加载计划任务
StudyCommerceTimerTask.TimerTask.NopConfig.Init(); if (ConnectionIsSet())//如果数据库有链接配置 { StudyCommerceTimerTask.TimerTask.TaskManager.Instance.Initialize(StudyCommerceTimerTask.TimerTask.NopConfig.ScheduleTasks); StudyCommerceTimerTask.TimerTask.TaskManager.Instance.Start(); }
/// <summary> /// 判断是否节点是否有链接字符串 /// </summary> /// <returns></returns> public static bool ConnectionIsSet() { return !string.IsNullOrEmpty(StudyCommerceTimerTask.TimerTask.NopConfig.ConnectionString); }
我大致的了解就是,这个计划任务就是=>Nopconfig=>TaskManager=>TaskThread=>Task=>ITask=>实现的接口类
利用的是Timer这个计时器进行委托方法进行调用。
里面有3个要注意:
1.加载节点利用的是IConfigurationSectionHandler和ConfigurationManager.GetSection("NopConfig");
2.反射这个就不多说了 this._task = Activator.CreateInstance(this._taskType) as ITask;
3.Timer 计时器new Timer(new TimerCallback(TimerHandler),null,this.Interval,this.Interval);
源代码下载: