我希望我的ASP.MVC应用程序可以作为后台任务的调度程序。 HttpApplication-subclassed类具有以下代码:
public class MvcApplication : System.Web.HttpApplication
{
private Timer Timer;
protected void Application_Start()
{
if (Timer == null)
{
TimerCallback cb = OnTimerElapsed;
AutoResetEvent autoEvent = new AutoResetEvent(false);
Timer = new Timer(cb, autoEvent, INITIAL_DELAY, TIMER_INTERVAL);
}
}
private void OnTimerElapsed(Object stateInfo)
{
//perform background task
}
}
此外,我还使用Quartz等效代码替换它,而不是使用System.Threading.Timer,但它也会在一段时间后停止触发。
所以这引出了一个问题,Application_Start()是正确的地方还是有更好的地方?
Timer和Quartz方法都有效。但是对于Quartz来说,似乎间隔1分钟,在20个间隔(20分钟)后,触发器不再发射。使用Timer,我不确定触发器停止触发的间隔时间。
答案 0 :(得分:1)
(注意:我发布这个答案已经很晚了,但对于任何绊倒我的两分钱的人都在下面)
20分钟的原因听起来像是空闲超时......默认是20分钟。
尝试将应用程序池中的空闲超时(高级设置)从20更改为0.我遇到了与我正在使用的一些队列内容类似的问题。此更改应该使应用程序保持运行并且计时器正在运行。
答案 1 :(得分:0)
ASP.Net不是您所描述的长期运行或定期运行流程的首选平台,但我不确定为什么您的计时器会停止触发。
然而,这是一篇想要完成几乎同样的事情的帖子,概述了他的方法:
http://www.west-wind.com/weblog/posts/2007/May/10/Forcing-an-ASPNET-Application-to-stay-alive