今天我们构建了一个控制台应用程序,用于运行ASP.NET网站的计划任务.但我认为这种方法有点容易出错且难以维护.如何执行计划任务(在Windows/IIS/ASP.NET环境中)
更新:
任务示例:
从数据库中的电子邮件队列发送电子邮件
从数据库中删除过时的对象
从Google AdWords检索统计信息并填写数据库中的表格.
BC... 128
Jeff Atwood为Stackoverflow提供的这种技术是我遇到过的最简单的方法.它依赖于构建到ASP.NET缓存系统中的"缓存项目已删除"回调机制
更新:Stackoverflow已经超出了这个方法.它只在网站运行时有效,但它是一种非常简单的技术,对很多人都有用.
另请参阅Quartz.NET
Jeff Atwood为Stackoverflow提供的这种技术是我遇到过的最简单的方法.它依赖于构建到ASP.NET缓存系统中的"缓存项目已删除"回调机制
更新:Stackoverflow已经超出了这个方法.它只在网站运行时有效,但它是一种非常简单的技术,对很多人都有用.
另请参阅Quartz.NET
我的所有网站任务(需要安排)都保存在网站内,并从特殊页面调用.然后我写了一个简单的Windows服务,每隔一段时间调用一次这个页面.页面运行后,它返回一个值.如果我知道还有更多的工作要做,我会马上再次运行页面,否则我会在一段时间内运行它.这对我来说非常有效,并且我的所有任务逻辑都与Web代码保持一致.在编写简单的Windows服务之前,我使用Windows调度程序每x分钟调用一次页面.
另一种方便的方法是使用Pingdom等监控服务.将他们的http检查指向运行您的服务代码的页面.让页面返回结果,然后可以用来触发Pingdom在出现问题时发送警报消息.
创建自定义Windows服务.
我将一些任务关键任务设置为计划的控制台应用程序,并发现它们很难维护.我创建了一个带有'heartbeat'的Windows服务,可以每隔几分钟检查一次我的数据库中的计划.它运作得很好.
话虽如此,我仍然使用预定的控制台应用程序来执行大多数非关键维护任务.如果没有损坏,请不要修理它.
我发现所有参与者都很容易:
创建Web服务方法,例如DoSuchAndSuchProcess
创建一个调用此web方法的控制台应用程序.
在任务计划程序中安排控制台应用程序.
使用此方法,所有业务逻辑都包含在您的Web应用程序中,但您具有Windows任务管理器或任何其他商业任务管理器的可靠性,可以将其启动并记录任何返回信息(如执行报告).使用Web服务而不是发布到页面有一些优势,因为它更容易从Web服务返回数据.
为什么重新发明轮子,使用线程和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}
这样,搜索引擎蜘蛛或恶意用户就无法执行您的计划任务.