在ASP.NET中使用System.Threading.Timer或Quartz

时间:2012-03-24 01:11:48

标签: c# quartz.net timertask

我希望我的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,我不确定触发器停止触发的间隔时间。

2 个答案:

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