Web程序里实现计划任务!(本文是转贴,作者不详)

在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案。但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用。   本文就介绍一个直接在Web应用程序中使用的简单的方法,这个方法不需要任何额外的配置即可轻松实现。  
   
  由于ASP.NET站点是作为Web应用程序运行的,它并不受线程的限制,因此我们可以非常方便地在Application_Start和Application_End事件中建立和销毁一个计划任务。下面就简单介绍一下在Web站点实现计划任务的方法。我们的例子是定时往文件里添加信息,作为例子,这里把当前的时间定时地写入文件中。  
   
  一个计划任务的工作单元称之为一个任务(Job),下面的代码描述了对所有任务都可以被调度引擎计划执行的一个通用的接口,这里的每个任务实现了Execute方法,供调度引擎进行调用:   
    
ContractedBlock.gif ExpandedBlockStart.gif
1None.gif public   interface   ISchedulerJob   
2ExpandedBlockStart.gifContractedBlock.gif    dot.gif{   
3InBlock.gif      void   Execute();   
4ExpandedBlockEnd.gif    }
   
  如前所述,我们的例子是实现往文件写如字符日期,下面就是实现这一任务的方法:   
    
ContractedBlock.gif ExpandedBlockStart.gif
 1None.gifpublic   class   SampleJob   :   ISchedulerJob   
 2ExpandedBlockStart.gifContractedBlock.gif    dot.gif{   
 3InBlock.gif      public   void   Execute()   
 4ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{   
 5InBlock.gif        //文件保存的物理路径,CSTest为虚拟目录名称,F:\Inetpub\wwwroot\CSTest为物理路径   
 6InBlock.gif        string   p   =   @"F:\Inetpub\wwwroot\CSTest";   
 7InBlock.gif        //我们在虚拟目录的根目录下建立SchedulerJob文件夹,并设置权限为匿名可修改,   
 8InBlock.gif        //SchedulerJob.txt就是我们所写的文件   
 9InBlock.gif        string   FILE_NAME   =   p+   "\\SchedulerJob\\SchedulerJob.txt";   
10InBlock.gif        //取得当前服务器时间,并转换成字符串   
11InBlock.gif        string   c   =   System.DateTime.Now.ToString("yyyy-mm-dd   hh:MM:ss");   
12InBlock.gif        //标记是否是新建文件的标量   
13InBlock.gif        bool   flag   =   false;   
14InBlock.gif        //如果文件不存在,就新建该文件   
15InBlock.gif        if   (!File.Exists(FILE_NAME))   
16ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{   
17InBlock.gif          flag   =   true;   
18InBlock.gif          StreamWriter   sr   =   File.CreateText(FILE_NAME);   
19InBlock.gif          sr.Close();   
20ExpandedSubBlockEnd.gif        }
   
21InBlock.gif        //向文件写入内容   
22InBlock.gif        StreamWriter   x   =   new   StreamWriter(FILE_NAME,true,System.Text.Encoding.Default);   
23InBlock.gif        if(flag)   x.Write("计划任务测试开始:");   
24InBlock.gif        x.Write("\r\n"+c);   
25InBlock.gif        x.Close();   
26ExpandedSubBlockEnd.gif      }
   
27ExpandedBlockEnd.gif    }
   
28None.gif
    
  接下来,我们建立一个配置对象,告诉调度引擎执行什么任务和执行的时间间隔。   
   
ContractedBlock.gif ExpandedBlockStart.gif
 1None.gifpublic   class   SchedulerConfiguration   
 2ExpandedBlockStart.gifContractedBlock.gif    dot.gif{   
 3InBlock.gif      //时间间隔   
 4InBlock.gif      private   int   sleepInterval;   
 5InBlock.gif      //任务列表   
 6InBlock.gif      private   ArrayList   jobs   =   new   ArrayList();   
 7InBlock.gif    
 8ExpandedSubBlockStart.gifContractedSubBlock.gif      public   int   SleepInterval   dot.gif{   get   dot.gif{   return   sleepInterval;   }   }   
 9ExpandedSubBlockStart.gifContractedSubBlock.gif      public   ArrayList   Jobs   dot.gif{   get   dot.gif{   return   jobs;   }   }   
10InBlock.gif    
11InBlock.gif      //调度配置类的构造函数   
12InBlock.gif      public   SchedulerConfiguration(int   newSleepInterval)   
13ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{   
14InBlock.gif        sleepInterval   =   newSleepInterval;   
15ExpandedSubBlockEnd.gif      }
   
16ExpandedBlockEnd.gif    }
   
17None.gif    
18None.gif
 
  下面就是调度引擎,定时执行配置对象的任务   
   
ContractedBlock.gif ExpandedBlockStart.gif
 1None.gif public   class   Scheduler   
 2ExpandedBlockStart.gifContractedBlock.gif    dot.gif{   
 3InBlock.gif      private   SchedulerConfiguration   configuration   =   null;   
 4InBlock.gif    
 5InBlock.gif      public   Scheduler(SchedulerConfiguration   config)   
 6ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{   
 7InBlock.gif        configuration   =   config;   
 8ExpandedSubBlockEnd.gif      }
   
 9InBlock.gif    
10InBlock.gif      public   void   Start()   
11ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{   
12InBlock.gif        while(true)   
13ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{   
14InBlock.gif          //执行每一个任务   
15InBlock.gif          foreach(ISchedulerJob   job   in   configuration.Jobs)   
16ExpandedSubBlockStart.gifContractedSubBlock.gif          dot.gif{   
17InBlock.gif            ThreadStart   myThreadDelegate   =   new   ThreadStart(job.Execute);   
18InBlock.gif            Thread   myThread   =   new   Thread(myThreadDelegate);   
19InBlock.gif            myThread.Start();   
20InBlock.gif            Thread.Sleep(configuration.SleepInterval);   
21ExpandedSubBlockEnd.gif          }
   
22ExpandedSubBlockEnd.gif        }
   
23ExpandedSubBlockEnd.gif      }
   
24ExpandedBlockEnd.gif    }
    
  所有的准备工作已经完成,下面就是激活引擎的工作了。为了让我们的任务计划执行,我们在Global.asax.cs文件里的Applicatio_Start和Application_End里进行建立和销毁工作,首先建立一个调度进程运行的线程,我们这里的运行间隔时间为3秒钟。   
    
ContractedBlock.gif ExpandedBlockStart.gif
 1None.gif public   System.Threading.Thread   schedulerThread   =   null;   
 2None.gif      protected   void   Application_Start(Object   sender,   EventArgs   e)   
 3ExpandedBlockStart.gifContractedBlock.gif      dot.gif{   
 4InBlock.gif     

转载于:https://www.cnblogs.com/edrh/archive/2006/11/21/567484.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值