2011-08-05 57 views
0

我用ASP .NET MVC 3,用于创建网页,我需要在我的Global.asax.cs文件中的每个20分钟后更改数据库的东西......我 设置定时器。下面是代码C#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

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

看到这个问题:

How to keep ASP.NET assemblies in AppDomain alive?

+0

我只是在本地主机测试了它......而应用程序是活跃;-) –

+2

+1 - 同意这是有可能的问题。但是我会考虑是否真的想要这样做,并且颠覆IIS的正常行为,以帮助您提高应用程序和服务器的性能和可靠性。 – Reddog

0

你可能会发现你的线程(从IIS应用程序池)被回收或关闭。用于请求 - 响应处理,而不是这种类型的行为时

的Web应用程序通常最好的工作。目前还不清楚你在做什么,但假设你正在使用SQL Server,也许你可以看看维护任务或触发器,如果​​它涉及非规范化数据(即卷起计算的数据)。如果它涉及在请求 - 响应过程中收集的数据,那么您可能会考虑使用Web缓存和一些针对延迟持久性的缓存过期操作。

0

我的猜测是太会话简单到期,但我想补充一点额外的费用。

阅读代码我想(再次)你在数据库中将用户标记为“不活跃”或断开连接或类似的东西。如果是这样,不使用定时器来做到这一点,相反,set the session expiration(当用户不发送在一定时间内的任何请求)所需的时间,并把代码要在在the Session_OnEnd handler

1
恰好运行

对我来说,它看起来像你的计时器将被垃圾收集杀死,因为你没有在它从Application_Start超出范围后保留它的引用。尝试添加:

Application["Whatever"] = timer;