很多时候我们希望在应用程序中按指定时间执行一些任务,一种解决办法是使用客户端就用程序或WINDOWS服务来执行,较早的一些项目就是采用这些方法,写个简单的控制台应用程序,然后由WINDOWS任务计划调用。这又让我想起我的一个同学,他曾经也在他的项目中使用WINDOWS服务来解决问题。

在ASP.NET应用程序中,并不是只能采用以上那些办法。取而代之的是通过IIS线程执行你的任务。而Quartz是第三方开源的作业调度框架,而Quartz.NET是Open Symphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。

在Quartz.NET有三个主要组成部分:调度,作业和触发器。写到这里感觉很多余,关于Quartz.NET方面的知识,我这里将提供一些地址。而这里我将叙述遇到的一些问题及解决方案:

1、应用池回收调度停止

Quartz.NET本身是寄托于IIS线程上面,所以一但应用池回收,导致放在内存中的数据也跟着丢失。因此对于这个问题,需要从IIS应用池配置、ASP.NET应用程序双方面结合。

IIS应用池配置主要是减少线程自动回收,主要影响因素包括:回收工作进程(分钟)、空闲超时关闭工作进程。

ASP.NET应用程序处理办法通过Application_Start和Application_End分别加载Quartz.NET和关闭Quartz.NET,特别是在Application_End时可以使用类似这种萎缩的方式,解决当由IIS应用池回收自动加载问题:

Thread.Sleep(1000);
string url = "Web Url";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
Stream receiveStream = myHttpWebResponse.GetResponseStream();

其实综合起来并不能很好解决所有问题,比较机器重启后等。

参考

  1. 开源的作业调度框架 – Quartz.NET
  2. Quartz.NET – Enterprise Job Scheduler for .NET Platform(官网)