C#Timer无法正常工作

时间:2011-08-05 05:46:36

标签: c# sql asp.net-mvc-3 stored-procedures timer

我使用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上午,我不知道它何时起作用。)

4 个答案:

答案 0 :(得分:4)

最可能的原因是您的AppDomain由于不活动而关闭,这意味着整个应用程序未运行。我认为空闲超时是20分钟不活动。

看到这个问题:

How to keep ASP.NET assemblies in AppDomain alive?

答案 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