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
}
}
本文介绍如何在ASP.NET应用中实现定时任务,包括在Global.asax.cs中设置定时器、处理定时任务逻辑以及更新数据库状态等关键步骤。
327

被折叠的 条评论
为什么被折叠?



