我用Visual Studio 2022社区写了一个ASP.NET系统。但是最近一个功能模块出现了一个奇怪的问题。
这里我有三个计时任务,一个不可控,另外两个任务运行正常。
上次就是这种情况下无法运行,比如这个任务执行系统逻辑,但是没有给用户发消息,我在日志中没有找到相关提示。
下面是我的代码:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
try
{
LogFile.WriteError(DateTime.Now + "Start");
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 + "error" + ex.ToString());
}
}
protected void Application_End()
{
LogFile.WriteError("Start 0230");
System.Threading.Thread.Sleep(5000);
string strUrl = "http://" + Application["WebApiUri_Authority"].ToString() + "/api/Msg/Post";
string strRec = HttpClientHelper.PostData("", strUrl, "", "", HttpClientHelper.PostContentType.JSON);
}
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 + "Start");
var count = checkworkBll.CheckWorkCreate();
time.Start();
}
}
catch (Exception ex)
{
LogFile.WriteError(DateTime.Now + "error" + ex.ToString());
time.Start();
}
}
每次任务停止后,我都试着重新启动程序恢复正常。但过了一段时间,它就会停止运行。我之前重新生成过Bin文件,会不会是这个原因造成的?
1条答案
按热度按时间lf3rwulv1#
我同意PanagiotisKanavos的观点,根据C#的垃圾回收机制,计时器很容易被回收,同时他也在评论中给出了相应的参考资料。
这里我想说的是,除了上述情况外,也可能是因为应用池关闭或回收。
IIS中有两种启动模式:OnDemand启动模式和AlwaysRun启动模式。通常默认启动模式为OnDemand,建议您切换为AlwaysRun启动模式,并将空闲时间设置为0,将启用预加载设置为true,并关闭应用池回收。
您可以参考here了解这两种模式之间的详细区别。
如果它不工作,请让我知道。