ASP.NET 项目中3个定时任务,其中有一个任务经常莫名奇妙的没有运行,其他两个任务运行正常。
定时任务业务逻辑是:每日在固定时间范围内(例如:22:00~23:00)进行考勤统计,统计后将结果发送微信消息给管理员。
没有运行有两种情况:1.完全没有Timer的时间处理程序(日志中没有记录下面代码中的“开始生成考勤策略”字样)。2.运行了统计逻辑但没有发送微信消息(未收到微信消息,也没有微信发送失败的相关错误日志)。主要代码如下
//程序启动
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
//WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
try
{
LogFile.WriteError(DateTime.Now + ":服务启动。");
//== 考勤策略生成服务
var checkWorkInterval = double.Parse((CachedConfigContext.Current.CheckWorkConfig.Interval * 1000).ToString());
Timer checkWorTime = new Timer(checkWorkInterval);
checkWorTime.Elapsed += new System.Timers.ElapsedEventHandler(CheckWorkEvent);
checkWorTime.AutoReset = true;
checkWorTime.Enabled = Convert.ToBoolean(CachedConfigContext.Current.CheckWorkConfig.MasterSwitch);
}
catch (Exception ex)
{
LogFile.WriteError(DateTime.Now + ";服务发生错误:" + ex.ToString());
}
}
//IIS休眠或结束时重新唤醒
protected void Application_End()
{
/*防止定时器失效*/
LogFile.WriteError("触发Application_End方法");
System.Threading.Thread.Sleep(5000);
string strUrl = "http://" + Application["WebApiUri_Authority"].ToString() + "/api/Msg/Post";
string strRec = HttpClientHelper.PostData("", strUrl, "", "", HttpClientHelper.PostContentType.JSON);
}
/// <summary>
/// 每日考勤策略生成事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CheckWorkEvent(object sender, ElapsedEventArgs e)
{
var time = (Timer)sender;
DateTime nowDate = DateTime.Now;//当前时间
try
{
DateTime startDate =CachedConfigContext.Current.CheckWorkConfig.StartTime;//22:00
DateTime endDate =CachedConfigContext.Current.CheckWorkConfig.EndTime;//23:00
if (startDate <= nowDate && nowDate <= endDate)
{
time.Stop();
LogFile.WriteError(DateTime.Now + ":开始生成考勤策略");
//生成考勤策略
var count = checkworkBll.CheckWorkCreate();//具体的业务逻辑
LogFile.WriteError(DateTime.Now + ":共生成" + count + "条考勤策略");
LogFile.WriteError(DateTime.Now + ":生成考勤策略结束");
time.Start();
}//判断是否在固定时间范围内
}
catch (Exception ex)
{
LogFile.WriteError(DateTime.Now + ":生成策略错误:" + ex.ToString());
time.Start();
}
}
每次任务停止后,我尝试重启程序就恢复正常,两天后又停止了,因为以前没有出现过该问题,于是我回想了最近做过的改动,曾经配置过IIS程序池将启动模式从“OnDemand”改为“AlwaysRunning”,同时将进程模型中的闲置时间20分钟改为0,再没有任何头绪的情况下,我尝试改回原先的配置后,竟然正常了。
我的问题是:IIS程序池的配置为什么会影响?是什么原理?请哪位有经验的朋友帮助解惑下,谢谢!
程序运行的环境是:操作系统windows server 2012 iis 8.0 .net4.5