C# - 当网站上没有任何活动时,Quartz调度程序停止运行

时间:2016-07-14 09:11:51

标签: c# asp.net quartz-scheduler

我用石英调度程序创建了asp.net站点。作业在后台运行,网站上没有其他活动。

Quartz调度程序每30分钟安排一次。

IIS启动后,Scheduler正常运行。

但过了一段时间,Scheduler停止了运行(大约1小时)。

如果在站点上有一个或多个活动作为用户登录或查看仪表板,则Scheduler会正确运行。

但是当网站上没有任何活动时它会停止运行。

如果现场没有活动,如何让我的计划程序保持活跃状态​​?

P / s:我知道我的问题可能与其他问题重复。但我仍然会问,因为我无法评论其他问题的答案。

编辑:

Day Running at: 7/14/2016 4:00:00 AM
--
Day Running at: 7/14/2016 4:30:00 AM
--
Day Running at: 7/14/2016 5:00:00 AM
--
Stopped running
--
Day Running at: 7/14/2016 2:00:00 PM
--
Day Running at: 7/14/2016 2:30:00 PM
--
Day Running at: 7/14/2016 3:00:00 PM
--
Stopped running
--

2 个答案:

答案 0 :(得分:5)

默认情况下,如果应用程序在一段时间内未收到任何请求,IIS将卸载您的应用程序。

您可以将IIS配置为永不卸载您的应用程序。有很多原因IIS将卸载您的应用程序 - 请确保您禁用所有这些。它位于应用程序池设置中,最好转到高级设置并仔细通过所有这些设置。

另外,如果您有后台作业,您需要按计划可靠地运行,除了Web应用程序之外,为什么不将它部署在Windows服务中呢? Web应用程序最擅长提供传入请求,而不是运行预定作业。

<强>更新

在应用程序池的高级设置中查看这些内容:

  • 过程模型/空闲超时和空闲超时操作
  • 回收/常规时间间隔,请求限制,专用内存限制,虚拟内存限制

答案 1 :(得分:3)

通常you shouldn't use ASP.NET for recurring tasks因为它不是为此而构建的,所以建议使用Windows服务。

但是,您可以使用WebBackgrounder。 Scott Hanselman似乎endorse it;)他还演示了如何使用Quartz.NET。

或者您可以启动一个线程,每分钟从您的应用程序生成请求,以保持它:

    protected void Application_Start()
    {
        // ...

        ThreadPool.QueueUserWorkItem(o => PingMyself());
    }

    private static void PingMyself()
    {
        var webClient = new WebClient();
        while (true)
        {
            Thread.Sleep(TimeSpan.FromMinutes(1));
            webClient.DownloadString("http://my.public.address.com");
        }
    }