今天,我们已经构建了一个控制台应用程序,用于运行ASP.NET网站的计划任务。但是我认为这种方法有点容易出错并且难以维护。如何执行计划的任务(在Windows / IIS / ASP.NET环境中)
更新:
任务示例:
- 从数据库中的电子邮件队列发送电子邮件
- 从数据库中删除过时的对象
- 从Google AdWords检索统计信息,然后在数据库中填写表格。
今天,我们已经构建了一个控制台应用程序,用于运行ASP.NET网站的计划任务。但是我认为这种方法有点容易出错并且难以维护。如何执行计划的任务(在Windows / IIS / ASP.NET环境中)
更新:
任务示例:
Answers:
我对网站的所有任务(需要计划)都保存在网站内,并从特殊页面调用。然后,我编写了一个简单的Windows服务,该服务经常调用此页面。页面运行后,它将返回一个值。如果我知道还有更多工作要做,请立即再次运行该页面,否则请过一会儿再运行它。这对我来说确实非常有效,并且将所有任务逻辑都保留在Web代码中。在编写简单的Windows服务之前,我使用Windows调度程序每x分钟调用一次该页面。
另一方便的运行方法是使用Pingdom之类的监视服务。将他们的http检查指向运行您的服务代码的页面。具有页面返回结果,然后可以将其用于在某些不正确的情况下触发Pingdom发送警报消息。
Jeff Atwood的Stackoverflow这项技术是我遇到的最简单的方法。它依赖于内置在ASP.NET缓存系统中的“已删除缓存项”回调机制
更新:Stackoverflow已不再支持此方法。它仅在网站运行时有效,但这是一种非常简单的技术,对许多人有用。
还要检查Quartz.NET
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
-杰夫·阿特伍德
创建一个自定义Windows服务。
我将一些关键任务设置为计划的控制台应用程序,发现它们难以维护。我创建了一个带有“心跳”功能的Windows服务,该服务每两分钟检查一次数据库中的计划。真的很好。
话虽如此,我仍然将调度的控制台应用程序用于大多数非关键维护任务。如果没有损坏,请不要修复。
我发现这对所有参与者都很容易:
使用此方法,所有业务逻辑都包含在您的Web应用程序中,但是您具有Windows任务管理器或任何其他商业任务管理器的可靠性,可以启动它并记录任何返回信息(例如执行报告)。使用Web服务而不是发布到页面有一个好处,因为它更容易从Web服务获取返回数据。
为什么要重新发明轮子,请使用Threading和Timer类。
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
}
使用Windows Scheduler运行网页。
为防止恶意用户或搜索引擎蜘蛛运行它,在设置计划任务时,只需使用查询字符串调用网页,即:mypage.aspx?from = scheduledtask
然后在页面加载中,只需使用以下条件:if(Request.Querystring [“ from”] ==“ scheduledtask”){// executetask}
这样,任何搜索引擎蜘蛛或恶意用户都将无法执行您计划的任务。
Request.IsLocal
>>仅服务器本身可以运行计划的任务,其他人不能运行。
该库的工作原理很像 http://www.codeproject.com/KB/cs/tsnewlib.aspx
它使您可以直接通过.NET代码管理Windows计划的任务。
我不确定您要执行的预定任务是什么。如果您指的是诸如“每小时刷新foo.xml”之类的任务,请使用Windows Scheduled Tasks系统。(“ at”命令,或通过控制器。)让它运行控制台应用程序或请求启动该过程的特殊页面。
编辑:我应该补充,这也是一种让IIS应用程序也按计划运行的好方法。因此,假设您想每30分钟检查一次数据库并向用户发送有关某些数据的电子邮件提醒,则可以使用计划任务来请求此页面,从而让IIS处理事情。
如果您的需求更为复杂,则可以考虑创建Windows服务,并使其运行循环以执行所需的任何处理。这也具有将代码分离出来以进行缩放或管理的好处。不利的一面是,您需要处理Windows服务。
这是另一种方式:
1)创建一个“心跳” Web脚本,该脚本负责在任务到期或过期时启动任务。
2)在某个地方(最好是在同一台Web服务器上)创建一个计划进程,该进程会命中该Web脚本并强制其定期运行。(例如,Windows计划任务使用IE或whathaveyou静默启动heatbeat脚本)
任务代码包含在Web脚本中的事实纯粹是为了将代码保留在 Web应用程序代码库中(假设两者都相互依赖),这将使Web开发人员更易于管理。
另一种方法是创建一个可执行服务器脚本/程序,该脚本/程序自行执行所有计划,然后将自身作为计划任务运行。这可以允许Web应用程序与计划任务之间的基本解耦。因此,如果即使在Web应用程序/数据库可能已关闭或无法访问的情况下,即使您需要计划的任务也要运行,则应该采用这种方法。
您可以轻松地创建一个Windows服务,使用“ ThreadPool.RegisterWaitForSingleObject”方法定期运行代码。它真的很光滑,而且设置起来也很容易。与使用Framework中的任何Timer相比,此方法都是更简化的方法。
请查看下面的链接以获取更多信息:
使用Windows服务在.NET中运行定期进程:http :
//allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
NET的新任务计划程序类库
注意:自创建该库以来,Microsoft引入了用于Windows Vista的新任务计划程序(任务计划程序2.0)。该库是Task Scheduler 1.0接口的包装,该接口在Vista中仍然可用,并且与Windows XP,Windows Server 2003和Windows 2000兼容。