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

共有两种方法:

一。使用Timer

global.asax

<%@ Application Language="C#" %> <%@ import Namespace="System.IO" %> <mce:script runat="server"><!-- void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 System.Timers.Timer myTimer = new System.Timers.Timer(10000); myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent); myTimer.Interval = 10000; myTimer.Enabled = true; } void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 } void Application_Error(object sender, EventArgs e) { // 在出现未处理的错误时运行的代码 } void Session_Start(object sender, EventArgs e) { // 在新会话启动时运行的代码 } void Session_End(object sender, EventArgs e) { // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 } private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e) { //间隔时间执行某动作 //指定日志文件的目录 string fileLogPath = AppDomain.CurrentDomain.BaseDirectory ; string fileLogName = "SoftPrj_CN_" + DateTime.Now.ToLongDateString() + "_log.txt"; //定义文件信息对象 FileInfo finfo = new FileInfo(fileLogPath + fileLogName); //创建只写文件流 using (FileStream fs = finfo.OpenWrite()) { //根据上面创建的文件流创建写数据流 StreamWriter strwriter = new StreamWriter(fs); //设置写数据流的起始位置为文件流的末尾 strwriter.BaseStream.Seek(0, SeekOrigin.End); //写入错误发生时间 strwriter.WriteLine("发生时间: " + DateTime.Now.ToString()); //写入日志内容并换行 //strwriter.WriteLine("错误内容: " + message); strwriter.WriteLine("错误内容: "); //写入间隔符 strwriter.WriteLine("---------------------------------------------"); strwriter.WriteLine(); //清空缓冲区内容,并把缓冲区内容写入基础流 strwriter.Flush(); //关闭写数据流 strwriter.Close(); fs.Close(); } } // --></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>
        
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
        
<sectionGroup name="common">
            
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
        
</sectionGroup>
    
</configSections>

     < common >
        
< logging >
            
< factoryAdapter type ="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging" >
                
< arg key ="showLogName" value ="true" />
                
< arg key ="showDataTime" value ="true" />
                
< arg key ="level" value ="DEBUG" />
                
< arg key ="dateTimeFormat" value ="HH:mm:ss:fff" />
            
</ factoryAdapter >
        
</ logging >
    
</ common >
    
< quartz >
        
< add key ="quartz.scheduler.instanceName" value ="ExampleDefaultQuartzScheduler" />
        
< add key ="quartz.threadPool.type" value ="Quartz.Simpl.SimpleThreadPool, Quartz" />
        
< add key ="quartz.threadPool.threadCount" value ="10" />
        
< add key ="quartz.threadPool.threadPriority" value ="2" />
        
< add key ="quartz.jobStore.misfireThreshold" value ="60000" />
        
< add key ="quartz.jobStore.type" value ="Quartz.Simpl.RAMJobStore, Quartz" />
    
</ quartz >


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

< appSettings >
        
< add key ="cronExpr" value ="0 0 8-17/1 ? * 2-6" />
    
</ appSettings >

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

public class RetrieveAj2003T140Job : Quartz.IJob
{
    
private static DataView aj2003View;

    
public RetrieveAj2003T140Job()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
     }


   

    
public void Execute(Quartz.JobExecutionContext context)
    
{
        
//throw new Exception("The method or operation is not implemented.");
        
//你的处理逻辑,也就是“工作”
     }

}


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

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

<% @ Import Namespace = " Quartz " %>

< script runat = " server " >

     IScheduler sched;
    
void Application_Start( object sender, EventArgs e)
    
{
        
// 在应用程序启动时运行的代码
         ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
         sched
= sf.GetScheduler();
         JobDetail job
= new JobDetail("job1", "group1", typeof(RetrieveAj2003T140Job));

        
string cronExpr = ConfigurationManager.AppSettings["cronExpr"];
         CronTrigger trigger
= new CronTrigger("trigger1", "group1", "job1", "group1",cronExpr);
         sched.AddJob(job,
true);
         DateTime ft
= sched.ScheduleJob(trigger);
         sched.Start();
        
     }

    
    
void Application_End( object sender, EventArgs e)
    
{
        
//   在应用程序关闭时运行的代码
        if (sched != null)
        
{
             sched.Shutdown(
true);
         }

     }

        

       
</ script >


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

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

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

你可能感兴趣的:(.net,timer,quartz,object,application,任务)