.NET 定时执行任务解决方案(Timer & Quartz.Net)

时间:2021-01-13 17:13:04

共有两种方法:

一。使用Timer

global.asax

[c-sharp] view plaincopy
  1. <%@ Application Language="C#" %>  
  2. <%@ import Namespace="System.IO" %>   
  3.   
  4. <mce:script runat="server"><!--  
  5. void Application_Start(object sender, EventArgs e)   
  6.     {  
  7.         // 在应用程序启动时运行的代码  
  8.         System.Timers.Timer myTimer = new System.Timers.Timer(10000);  
  9.         myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);  
  10.         myTimer.Interval = 10000;  
  11.         myTimer.Enabled = true;  
  12. }  
  13.       
  14.     void Application_End(object sender, EventArgs e)   
  15.     {  
  16.         //  在应用程序关闭时运行的代码  
  17.   
  18.     }  
  19.           
  20.     void Application_Error(object sender, EventArgs e)   
  21.     {   
  22.         // 在出现未处理的错误时运行的代码  
  23.   
  24.     }  
  25.   
  26.     void Session_Start(object sender, EventArgs e)   
  27.     {  
  28.         // 在新会话启动时运行的代码  
  29.   
  30.     }  
  31.   
  32.     void Session_End(object sender, EventArgs e)   
  33.     {  
  34.         // 在会话结束时运行的代码。   
  35.         // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为  
  36.         // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer   
  37.         // 或 SQLServer,则不会引发该事件。  
  38.   
  39.     }  
  40.     private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)  
  41.     {  
  42.         //间隔时间执行某动作  
  43.           
  44.           
  45.         //指定日志文件的目录  
  46.         string fileLogPath = AppDomain.CurrentDomain.BaseDirectory ;  
  47.         string fileLogName = "SoftPrj_CN_" + DateTime.Now.ToLongDateString() + "_log.txt";  
  48.         //定义文件信息对象  
  49.         FileInfo finfo = new FileInfo(fileLogPath + fileLogName);  
  50.   
  51.         //创建只写文件流  
  52.         using (FileStream fs = finfo.OpenWrite())  
  53.         {  
  54.             //根据上面创建的文件流创建写数据流  
  55.             StreamWriter strwriter = new StreamWriter(fs);  
  56.             //设置写数据流的起始位置为文件流的末尾  
  57.             strwriter.BaseStream.Seek(0, SeekOrigin.End);  
  58.             //写入错误发生时间  
  59.             strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());  
  60.             //写入日志内容并换行  
  61.             //strwriter.WriteLine("错误内容: " + message);  
  62.             strwriter.WriteLine("错误内容: ");   
  63.             //写入间隔符  
  64.             strwriter.WriteLine("---------------------------------------------");  
  65.             strwriter.WriteLine();  
  66.             //清空缓冲区内容,并把缓冲区内容写入基础流  
  67.             strwriter.Flush();  
  68.             //关闭写数据流  
  69.             strwriter.Close();  
  70.             fs.Close();  
  71.         }  
  72. }  
  73. // --></mce:script>  

二,使用Quartz.Net

Quartz是一个Java开源的作业调度框架。官方网站:http://www.opensymphony.com/quartz/

IBM网站上有一篇简单易懂的文章:http://www.ibm.com/developerworks/cn/java/j-quartz/

Quartz.net是从java版本移植到.net版本的。官方网站:http://quartznet.sourceforge.net/

网上找了好多教程,但没有一篇是关于如何在ASP.NET中使用的代码。既然它适用于任何的.net程序,当然也就适用于asp.net的web应用。

(1)在web.config中进行相关配置

   <configSections>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<sectionname="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<sectionGroupname="common">
.NET 定时执行任务解决方案(Timer & Quartz.Net)            
<sectionname="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
</sectionGroup>
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
</configSections>

.NET 定时执行任务解决方案(Timer & Quartz.Net)    <common>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<logging>
.NET 定时执行任务解决方案(Timer & Quartz.Net)            
<factoryAdaptertype="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
.NET 定时执行任务解决方案(Timer & Quartz.Net)                
<argkey="showLogName" value="true"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)                
<argkey="showDataTime" value="true"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)                
<argkey="level" value="DEBUG"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)                
<argkey="dateTimeFormat" value="HH:mm:ss:fff"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)            
</factoryAdapter>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
</logging>
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
</common>
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
<quartz>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="quartz.threadPool.threadCount" value="10"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="quartz.threadPool.threadPriority" value="2"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="quartz.jobStore.misfireThreshold" value="60000"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
</quartz>


另外我自己加了一个配置项:

.NET 定时执行任务解决方案(Timer & Quartz.Net)<appSettings>
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
<addkey="cronExpr" value="0 0 8-17/1 ? * 2-6"/>
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
</appSettings>

(2)创建一个普通类,实现Quartz.IJob接口

.NET 定时执行任务解决方案(Timer & Quartz.Net)publicclass RetrieveAj2003T140Job : Quartz.IJob
.NET 定时执行任务解决方案(Timer & Quartz.Net)
{
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
privatestatic DataView aj2003View;
.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
public RetrieveAj2003T140Job()
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
{
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
//
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
// TODO: 在此处添加构造函数逻辑
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
//
.NET 定时执行任务解决方案(Timer & Quartz.Net)
     }

.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)   
.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
publicvoid Execute(Quartz.JobExecutionContext context)
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
{
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
//throw new Exception("The method or operation is not implemented.");
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
//你的处理逻辑,也就是“工作”
.NET 定时执行任务解决方案(Timer & Quartz.Net)
     }

.NET 定时执行任务解决方案(Timer & Quartz.Net)}


接口非常简单,只要在Execute()方法中进行逻辑处理就可以了。比如,读取数据库数据,或者是读取电子邮件。

(3)在Global.asax文件中启动工作调度
这便于我们在web应用启动时,就启动工作调度。

.NET 定时执行任务解决方案(Timer & Quartz.Net)<%@ Import Namespace="Quartz"%>
.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)
<script runat="server">
.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)     IScheduler sched;
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
void Application_Start(object sender, EventArgs e)
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
{
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
// 在应用程序启动时运行的代码
.NET 定时执行任务解决方案(Timer & Quartz.Net)
         ISchedulerFactory sf= new Quartz.Impl.StdSchedulerFactory();
.NET 定时执行任务解决方案(Timer & Quartz.Net)         sched
= sf.GetScheduler();
.NET 定时执行任务解决方案(Timer & Quartz.Net)         JobDetail job
= new JobDetail("job1","group1",typeof(RetrieveAj2003T140Job));
.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
string cronExpr= ConfigurationManager.AppSettings["cronExpr"];
.NET 定时执行任务解决方案(Timer & Quartz.Net)         CronTrigger trigger
= new CronTrigger("trigger1","group1","job1","group1",cronExpr);
.NET 定时执行任务解决方案(Timer & Quartz.Net)         sched.AddJob(job,
true);
.NET 定时执行任务解决方案(Timer & Quartz.Net)         DateTime ft
= sched.ScheduleJob(trigger);
.NET 定时执行任务解决方案(Timer & Quartz.Net)         sched.Start();
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
.NET 定时执行任务解决方案(Timer & Quartz.Net)     }

.NET 定时执行任务解决方案(Timer & Quartz.Net)    
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
void Application_End(object sender, EventArgs e)
.NET 定时执行任务解决方案(Timer & Quartz.Net)    
{
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
//   在应用程序关闭时运行的代码
.NET 定时执行任务解决方案(Timer & Quartz.Net)
        if (sched!= null)
.NET 定时执行任务解决方案(Timer & Quartz.Net)        
{
.NET 定时执行任务解决方案(Timer & Quartz.Net)             sched.Shutdown(
true);
.NET 定时执行任务解决方案(Timer & Quartz.Net)         }

.NET 定时执行任务解决方案(Timer & Quartz.Net)     }

.NET 定时执行任务解决方案(Timer & Quartz.Net)        
.NET 定时执行任务解决方案(Timer & Quartz.Net)
.NET 定时执行任务解决方案(Timer & Quartz.Net)       
.NET 定时执行任务解决方案(Timer & Quartz.Net)
</script>


需要注意的是,当Application_End的时候,需要关闭Quartz的工作。

OK了,可以在ASP.NET中正常使用了。

摘自:http://hi.baidu.com/jok607/blog/item/4e0c83234c6de743ac34def7.html