Asp.Net 执行定时任务,我们要在Global.asax.cs中添加如下代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; namespace SurveyOnline { public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 System.Timers.Timer myTimer = new System.Timers.Timer(); //OnTimedEvent任务 myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent); //间隔1秒 myTimer.Interval = 1000; myTimer.Enabled = true; } void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 } void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 } void Session_Start(object sender, EventArgs e) { // 在新会话启动时运行的代码 } void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 } #region 定时任务 /// <summary> /// 定时任务处理 /// </summary> /// <param name="source"></param> /// <param name="e"></param> private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e) { //获得当前时间单位 int eyear = e.SignalTime.Year; int emonth = e.SignalTime.Month; int eday = e.SignalTime.Day; int ehour = e.SignalTime.Hour; int eminute = e.SignalTime.Minute; int esecond = e.SignalTime.Second; //获取未处理的定时任务列表 DataTable task = getTimeTag(); for (int i = 0; i < task.Rows.Count; i++) { //定时任务的时间 string date_time = task.Rows[i]["dateTime"].ToString(); //分解时间 SortedList<string, int> sl = getDateTimeMap(date_time); //任务时间单位 int year = sl["year"]; int month = sl["month"]; int day = sl["day"]; int hour = sl["hour"]; int minute = sl["minute"]; int second = sl["second"]; //处理 当前时间 = 定时任务时间 if (eyear == year && emonth == month && eday == day && ehour == hour && eminute == minute && esecond == second) { string connectionString = "server=127.0.0.1;database=We7_CMS;uid=sa;pwd=123456"; SqlConnection myConnection = new SqlConnection(connectionString); string sql = "update Article set state=1 where ID='" + task.Rows[i]["articleID"].ToString() + "'"; string id = task.Rows[i]["id"].ToString(); SqlCommand myCommand = new SqlCommand(sql, myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); myConnection.Close(); updateTaskState(connectionString, id); } } } /// <summary> /// 修改定时任务表 任务状态 state /// </summary> /// <param name="connectionString">连接字符串</param> /// <param name="id">任务ID</param> private static void updateTaskState(string connectionString, string id) { SqlConnection myConnection = new SqlConnection(connectionString); string sql = "update TimerTask set state=1 where id=" + id; SqlCommand myCommand = new SqlCommand(sql, myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); myConnection.Close(); } /// <summary> /// 分解时间日期, 年 月 日 时 分 秒 得到每个单位的值 /// </summary> /// <param name="date_time">字符串日期 例如:2013-06-10 11:36:12</param> /// <returns>类似Map的键值集合</returns> private static SortedList<string, int> getDateTimeMap(string date_time) { string[] dts = date_time.Split(' '); string date = dts[0]; string time = dts[1]; string[] ymd = date.Split('-'); int year = Convert.ToInt32(ymd[0]); int month = Convert.ToInt32(ymd[1]); int day = Convert.ToInt32(ymd[2]); string[] hms = time.Split(':'); int hour = Convert.ToInt32(hms[0]); int minute = Convert.ToInt32(hms[1]); int second = Convert.ToInt32(hms[2]); SortedList<string, int> sl = new SortedList<string, int>(); sl.Add("year", year); sl.Add("month", month); sl.Add("day", day); sl.Add("hour", hour); sl.Add("minute", minute); sl.Add("second", second); return sl; } /// <summary> /// 获得未处理的定时任务 state=0 未处理 /// </summary> /// <returns>未处理的定时任务列表</returns> private static DataTable getTimeTag() { StringBuilder strSql = new StringBuilder(); strSql.Append("select * "); strSql.Append(" FROM TimerTasK where state=0 "); return SqlHelper.ExecuteDataTable(CommandType.Text, strSql.ToString(), null); } #endregion } }