Asp.net 运行计划任务的最佳方法

Asp.net 运行计划任务的最佳方法,asp.net,windows,iis,scheduled-tasks,Asp.net,Windows,Iis,Scheduled Tasks,今天,我们构建了一个控制台应用程序,用于运行ASP.NET网站的计划任务。但我认为这种方法容易出错,而且很难维护。如何执行计划任务(在windows/IIS/ASP.NET环境中) 更新: 任务示例: 从数据库中的电子邮件队列发送电子邮件 从数据库中删除过时的对象 从GoogleAdwords检索统计数据并填充数据库中的表 我不知道你指的是什么样的计划任务。如果您指的是“每小时刷新foo.xml”类型的任务,那么请使用Windows计划任务系统。(at命令,或通过控制器)让它运行控制台应用程序

今天,我们构建了一个控制台应用程序,用于运行ASP.NET网站的计划任务。但我认为这种方法容易出错,而且很难维护。如何执行计划任务(在windows/IIS/ASP.NET环境中)

更新:

任务示例:

  • 从数据库中的电子邮件队列发送电子邮件
  • 从数据库中删除过时的对象
  • 从GoogleAdwords检索统计数据并填充数据库中的表

我不知道你指的是什么样的计划任务。如果您指的是“每小时刷新foo.xml”类型的任务,那么请使用Windows计划任务系统。(at命令,或通过控制器)让它运行控制台应用程序或请求启动进程的特殊页面

编辑:我应该补充一点,这是一个让你的IIS应用程序在预定时间点运行的好方法。因此,假设您希望每30分钟检查一次数据库,并向用户发送有关某些数据的电子邮件提醒,您可以使用计划任务请求此页面,从而让IIS处理这些内容

如果你的需求更复杂,你可以考虑创建一个Windows服务并让它运行一个循环来做你需要的任何处理。这还有一个好处,就是为了扩展或管理目的而分离代码。另一方面,你需要处理Windows服务。

是我遇到的最简单的方法。它依赖于ASP.NET缓存系统中内置的“缓存项已删除”回调机制

更新:Stackoverflow已超出此方法的范围。它只在网站运行时起作用,但这是一种非常简单的技术,对许多人都很有用


另请查看

我们也使用控制台应用程序。如果您使用Log4net之类的日志工具,您可以正确地监视它们的执行。此外,我不确定它们如何比网页更难维护,因为如果设计得当,您可能会在两者之间共享一些相同的代码库

如果您反对定时运行这些任务,您可以在网站的管理部分设置一个充当队列的网页。用户输入一个运行任务的请求,然后在MyProcessQueue表上插入一条空白的日期戳记录,您的计划任务每X分钟检查一次MyProcessQueue中的新记录。这样,它只在客户希望它运行时运行


希望这些建议能有所帮助。

如果您拥有该服务器,则应使用windows任务计划程序。使用AT/?从命令行查看选项


否则,在基于web的环境中,您可能必须执行一些令人讨厌的操作,例如设置不同的计算机,以便在一定的时间间隔内向特定页面发出请求。

一个选项是设置windows服务,并使其调用您的计划任务

在winforms中,我使用了计时器,但我不认为这在ASP.NET中可以很好地工作

我为网站执行的所有任务(需要安排)都保存在网站中,并从特殊页面调用。然后我编写了一个简单的Windows服务,它经常调用这个页面。一旦页面运行,它将返回一个值。如果我知道还有更多的工作要做,我会立即再次运行页面,否则我会在一段时间内运行它。这对我来说非常有效,并使我所有的任务逻辑与web代码保持一致。在编写简单的Windows服务之前,我使用Windows调度程序每x分钟调用一次页面

另一种方便的运行方法是使用监控服务,如。将他们的http检查指向运行服务代码的页面。具有页面返回结果,然后可以使用该结果在出现问题时触发Pingdom发送警报消息。

还有另一种方法:

1) 创建一个“heartbeat”web脚本,该脚本负责在任务到期或过期时启动任务

2) 在某个地方(最好是在同一个web服务器上)创建一个访问webscript并强制它以固定间隔运行的计划进程。(例如,windows计划任务,使用IE或whathaveyou悄悄启动热拍脚本)

任务代码包含在web脚本中的事实纯粹是为了将代码保持在web应用程序代码库中(假设两者相互依赖),这将使web开发人员更易于管理

另一种方法是创建一个可执行服务器脚本/程序,该脚本/程序本身执行所有调度工作,并将可执行文件本身作为调度任务运行。这可以实现web应用程序和计划任务之间的基本解耦。因此,如果您需要在web应用程序/数据库可能已关闭或无法访问的情况下运行计划任务,则应采用这种方法

我已经成功地在一个ASP.NET项目中使用了(这里有一些)

此方法的唯一问题是,如果从内存中卸载ASP.NET web应用程序,任务将不会运行(即,由于使用率低)。我尝试过的一件事是创建一个任务,每5分钟访问一次web应用程序,使其保持活动状态,但这似乎不能可靠地工作,因此现在我使用Windows调度器和基本控制台应用程序来代替它

理想的解决方案是创建一个Windows服务,尽管这可能是不可能的(例如,如果您使用的是共享托管环境)。从维护的角度来看,它还使事情变得更容易,以便将事情保存在web应用程序中。

创建一个

我将一些关键任务设置为预定的控制台应用程序,发现它们很难维护。我创建了一个带有“心跳”的Windows服务,每隔几分钟检查一次数据库中的时间表。事情进展得很顺利

话虽如此,我仍然会在大部分非关键维护任务中使用定时控制台应用程序。如果它没有坏,就别修了。

我找到了
    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }