下面的代码描述了对所有任务都可以被调度引擎计划执行的一个通用的接口,这里的每个任务实现了Execute方法,供调度引擎进行调用:
public interface ISchedulerJob { void Execute(); } 如前所述,我们的例子是实现往文件写如字符日期, 下面就是实现这一任务的方法: public class SampleJob : ISchedulerJob { public void Execute() { //文件保存的物理路径,CSTest为虚拟目录名称, F:\Inetpub\wwwroot\CSTest为物理路径 string p = @"F:\Inetpub\wwwroot\CSTest"; //我们在虚拟目录的根目录下建立SchedulerJob文件夹, 并设置权限为匿名可修改, //SchedulerJob.txt就是我们所写的文件 string FILE_NAME = p+ "\\SchedulerJob\\SchedulerJob.txt"; //取得当前服务器时间,并转换成字符串 string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss"); //标记是否是新建文件的标量 bool flag = false; //如果文件不存在,就新建该文件 if (!File.Exists(FILE_NAME)) { flag = true; StreamWriter sr = File.CreateText(FILE_NAME); sr.Close(); } //向文件写入内容 StreamWriter x = new StreamWriter (FILE_NAME,true,System.Text.Encoding.Default); if(flag) x.Write("计划任务测试开始:"); x.Write("\r\n"+c); x.Close(); } } 接下来,我们建立一个配置对象, 告诉调度引擎执行什么任务和执行的时间间隔。 public class SchedulerConfiguration { //时间间隔 private int sleepInterval; //任务列表 private ArrayList jobs = new ArrayList(); public int SleepInterval { get { return sleepInterval; } } public ArrayList Jobs { get { return jobs; } } //调度配置类的构造函数 public SchedulerConfiguration(int newSleepInterval) { sleepInterval = newSleepInterval; } }
下面就是调度引擎,定时执行配置对象的任务
public class Scheduler { private SchedulerConfiguration configuration = null; public Scheduler(SchedulerConfiguration config) { configuration = config; } public void Start() { while(true) { //执行每一个任务 foreach(ISchedulerJob job in configuration.Jobs) { ThreadStart myThreadDelegate = new ThreadStart(job.Execute); Thread myThread = new Thread(myThreadDelegate); myThread.Start(); Thread.Sleep(configuration.SleepInterval); } } } }
所有的准备工作已经完成,下面就是激活引擎的工作了。为了让我们的任务计划执行,我们在Global.asax.cs文件里的Applicatio_Start和Application_End里进行建立和销毁工作,首先建立一个调度进程运行的线程,我们这里的运行间隔时间为3秒钟。
public System.Threading.Thread schedulerThread = null; protected void Application_Start(Object sender, EventArgs e) { SchedulerConfiguration config = new SchedulerConfiguration(1000*3); config.Jobs.Add(new SampleJob()); Scheduler scheduler = new Scheduler(config); System.Threading.ThreadStart myThreadStart = new System.Threading.ThreadStart(scheduler.Start); System.Threading.Thread schedulerThread = new System.Threading.Thread(myThreadStart); schedulerThread.Start(); } 最后还需要在程序退出时进行销毁: protected void Application_End(Object sender, EventArgs e) { if (null != schedulerThread) { schedulerThread.Abort(); } }
好了,在VS.NET里建立一个C#的Web应用程序工程,建立TaskScheduler.cs类,并修改相应的Global.asax.cs文件。为了能看到效果,我们再建立一个表单WebForm1.aspx,定时刷新来检查我们所记录的数据:
<%@ Page language="c#" Codebehind ="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="CSTest.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>在Web应用程序中执行计划任务的例子</title> <meta http-equiv="refresh" content="10"> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content ="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <iframe style="width:100%;height:100%" src ="/SchedulerJob/SchedulerJob.txt"></iframe> </form> </body> </HTML> 对工程进行编译并运行,就可以看到结果了,结果如下: 计划任务测试开始: 2003-13-10 11:08:15 2003-13-10 11:08:18 2003-13-10 11:08:21 2003-13-10 11:08:24 2003-13-10 11:08:27 2003-13-10 11:08:30
|