我使用Asp .NET Mvc 3创建网页,我需要在每20分钟后更改数据库中的内容... 我在我的Global.asax.cs文件中设置了Timer。这是代码
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
Unit = new UnitOfWork();
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 1200000; //20 minutes
timer.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed);
timer.Start();
}
void Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Unit.Srvc.UpdateUserActivity();
}
现在我今天运行它,多么可怜,它只运行一次...... 20分钟后它改变了数据库而且都是。
P.S.Yesteday我在20秒内测试了它并且工作正常。但是,今天它不希望在20分钟的间隔内正常工作。谢谢你的帮助。
P.S.2我使用存储过程来更新数据库。
PS3刚刚我发现它是随机工作的:D在5:32Am我运行程序......它工作在5:52Am,在6:12Am不起作用,现在可以工作(现在是6: 49上午,我不知道它何时起作用。)答案 0 :(得分:4)
最可能的原因是您的AppDomain由于不活动而关闭,这意味着整个应用程序未运行。我认为空闲超时是20分钟不活动。
看到这个问题:
答案 1 :(得分:1)
对我来说,看起来你的计时器将被垃圾收集杀死,因为你没有在它超出Application_Start的范围后保留对它的引用。尝试添加:
Application["Whatever"] = timer;
答案 2 :(得分:0)
您可能会发现您的线程(来自IIS AppPool)正在被回收或关闭。
Web应用程序在用于请求 - 响应处理时通常效果最佳,而不是此类行为。目前尚不清楚你在做什么,但假设你正在使用SQL Server,或许你可以查看维护任务或触发器,如果它涉及非规范化数据(即汇总计算数据)。如果它涉及在请求 - 响应过程中收集的数据,那么您可能会考虑使用Web缓存和一些缓存过期操作来延迟持久性。
答案 3 :(得分:0)
我的猜测也是会话过期,但我想补充一点。
读取代码我想(再次)你将数据库中的用户标记为“未激活”或断开连接或类似的东西。如果是这样,请不要使用计时器来执行此操作,而是使用set the session expiration(当用户未在一段时间内发送任何请求时)到所需的持续时间,并在发生这种情况时将您想要运行的代码放入the Session_OnEnd handler