在WEB程序中轻松执行计划任务(多线程)

原创 2004年07月29日 08:25:00

在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案。但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用。 本文就介绍一个直接在Web应用程序中使用的简单的方法,这个方法不需要任何额外的配置即可轻松实现。

由于ASP.NET站点是作为Web应用程序运行的,它并不受线程的限制,因此我们可以非常方便地在Application_Start和Application_End事件中建立和销毁一个计划任务。下面就简单介绍一下在Web站点实现计划任务的方法。我们的例子是定时往文件里添加信息,作为例子,这里把当前的时间定时地写入文件中。

一个计划任务的工作单元称之为一个任务(Job),下面的代码描述了对所有任务都可以被调度引擎计划执行的一个通用的接口,这里的每个任务实现了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,定时刷新来检查我们所记录的数据:

对工程进行编译并运行,就可以看到结果了,结果如下:

  计划任务测试开始:
  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

需要说明的是,以上只是在Web应用程序中执行计划任务的简单例子,对于多个任务来说,需要在不同的线程内进行工作,对计划的安排也是很简单的,实际还需要站点堵塞,当机的情况。另外这里也没有进行错误的处理等工作,相信大家会写出更加完美的代码的。

JSP白皮书

JavaServer PagesTM (JSP)技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与...
  • weqa
  • weqa
  • 2000-09-02 22:48:00
  • 2943

用Win7任务计划定时执行

shutdown命令灵活设置任务计划,让Win7系统实现定时自动关机,并且可以定制日常任务,让Win7按指定时间频率自动执行。   我们在Win7系统中点击开始按钮,依次选择打开“所有程序—附件...
  • liqfyiyi
  • liqfyiyi
  • 2013-04-17 11:14:30
  • 8049

如何使用windows计划任务运行jar程序

自己编写了一个jar小工具,想在自己电脑上每天运行,通过直接运行jar不行,通过bat也不行。在网上搜索了如何使用windows计划任务运行jar程序,出来一大堆,都没有完整的解决方案,不过通过别人的...
  • jie717053623
  • jie717053623
  • 2017-03-17 16:51:14
  • 1052

多线程 —— 多线程在WEB开发中的应用相关问题

1.web应用中,要对某一个任务用多线程实现,最简单的代码格式是不是必须把要执行的代码放在run方法中? WEB服务器会帮你把每个访问请求开辟一个线程,你只要按照你所开发的框架,比如tomcat会让你...
  • yifanSJ
  • yifanSJ
  • 2016-04-28 12:44:00
  • 3296

Windows 任务计划程序定时执行 powershell 脚本

由于需要进行一些特殊操作,打算使用 powershell 来写脚本,需要Windows 任务计划程序定时执行。 做一个简单测试:本地拷贝一个文件到其他盘中 创建文件: aa.txt 创建power...
  • kk185800961
  • kk185800961
  • 2016-01-26 16:05:47
  • 10487

Windows计划任务执行时不显示窗口的问题

最近开发了工具,带界面的,需要定时执行的,为了方便直接用Windows计划任务做定时了。跑了一段时间发现,进程中也有,就是看不到程序的界面,进程的执行貌似也阻塞了。 从网上查了下,发现时启动方式...
  • davidsu33
  • davidsu33
  • 2016-10-31 10:23:22
  • 4924

在WINDOWS任务计划程序下执行PHP文件 PHP定时功能的实现

最近需要做一个定时任务功能,从网站找了很多相关的代码,windows实现方法综合起来大概就两种, 一、使用PHP ignore_user_abort 函数 即使关掉浏览器也能正常运行;(个人感觉PH...
  • vailook
  • vailook
  • 2017-02-24 14:50:31
  • 3853

Windows 任务计划执行Python程序的设置

Windows 任务计划执行Python程序的设置
  • wu_boy
  • wu_boy
  • 2016-04-21 10:28:31
  • 4753

VB的计划任务的问题

做一个监控的小程序,担心它中途挂掉,所以把它加到了计划任务里,每天执行一次。 程序执行Form_load时 程序大致结构如下: Private Sub Form_Load() If App....
  • gtclulong
  • gtclulong
  • 2015-11-30 16:50:32
  • 858

win2008 计划任务配置(任务计划程序)每分钟执行BAT

http://www.cnblogs.com/amylis_chen/archive/2012/07/14/2591492.html 1、windows2008计划任务配置每分钟执行能配置吗...
  • qq_25600055
  • qq_25600055
  • 2015-04-14 14:03:07
  • 895
收藏助手
不良信息举报
您举报文章:在WEB程序中轻松执行计划任务(多线程)
举报原因:
原因补充:

(最多只允许输入30个字)