ASP.NET网站每隔几分钟运行一次

时间:2016-05-28 07:43:36

标签: c# asp.net quartz-scheduler

我正在寻找以下问题的解决方案:我有一个网站,希望每隔一小时(大约)将邮件发送到某个地址。 所以我决定使用Quartz库来实现C#。我写了作业,Start()函数和Execute:

public static void Start()
{
    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
    scheduler.Start();

    IJobDetail job = JobBuilder.Create<EmailJob>().Build();

    ITrigger trigger = TriggerBuilder.Create()
    .WithIdentity("trigger1", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInMinutes(50)
        .RepeatForever())
    .Build();

    scheduler.ScheduleJob(job, trigger);
}

在Application_start()中:

 JobScheduler.Start();

当我在本地运行网站时,它的工作非常完美,因为应用程序位于&#34; Play&#34;模式一直都是。所以它按预期每50分钟发送一次邮件。

现在出现问题:将网站上传到服务器时,Job只工作了一次 - 第一次。在我读到它之后,我对这个问题的结论是网站应用程序有一个&#34; sleep&#34;模式,所以如果有人没有进入网站,应用程序处于睡眠状态,因此工作无效,电子邮件也没有发送。

所以我的问题是 - 如果我想要一个每50分钟运行一次功能的调度程序,我该怎么办?如果有人进入该网站,我该怎么办?

2 个答案:

答案 0 :(得分:0)

检查您的设计。通过创建控制台应用程序并使用windows task Scheduler或撰写Windows Service Application

,您可以获得更好的效果

答案 1 :(得分:0)

根据您使用的IIS版本,它看起来略有不同。但您需要以alwaysrunning模式设置应用程序:
web.config中添加这样的applicationsPools部分:

<applicationPools>
  <add name="appName" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

或者,您可以通过单击应用程序池上的高级设置在IIS管理中更改此设置。

(将managedRuntimeVersion设置为您的应用程序版本当然)

编辑:正如Ravi所说,这必须与启动模块或一些保持网站运行的外部服务相结合。

另一种解决方案可能是迁移到Hangfire并使用IProcessHostPreloadClient和我总是运行的方法。