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

windows2008计划任务无法运行解决方案

近碰到一个问题windows 2008的计划任务执行问题,程序如下图SendMessage V2.0.exe运行需要调用SendMessage V2.0.pdb数据库的数据 症状如下,计划任...
  • quanhj
  • quanhj
  • 2014年11月27日 10:15
  • 24249

如何用计划任务执行powershell脚本

假如有一个powershell脚本要用计划任务运行,然而powershell脚本并非“双击”就可以打开,那么该如何运行呢? 难点:      0 一些权限导致无法加载脚本      1 如何执行.ps...
  • ViviaChen
  • ViviaChen
  • 2014年02月27日 17:08
  • 3285

PHP定时执行计划任务

一、windows计划任务 1、写一个PHP程序,命名为test.php,内容如下所示: [php] view plain copy     $f...
  • yongzhen150
  • yongzhen150
  • 2016年07月26日 14:35
  • 966

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
  • 757

PHP + PYTHON 多任务多线程,后台运行,计划任务-实现方法

有时候在做程序的时候,会发现AJAX来做批量异步不怎么好。而PHP又不支持多线程。效率不高。 在这个时候就会使用PYTHON来做后台多线程操作。 在WINDOWS下比较麻烦,第一:如果是多任务的话,需...
  • RuningBoys
  • RuningBoys
  • 2016年03月25日 09:42
  • 1120

.net c#操作windows计划任务程序,新建,运行,停止,启用,禁用计划任务

/// /// 1.引用:C:\Windows\System32\taskschd.dll /// 2.属性:嵌入互操作类型=False /// 3....
  • jxian2009
  • jxian2009
  • 2014年10月15日 14:52
  • 642

【定时任务】Windows Server 2008/2012 计划任务配置(任务计划程序)每分钟执行BAT php

1、Windows Server 2008 计划任务在哪里配置? 2、Windows Server 2008 可以配置每分钟或是每小时执行我的任务吗? 答案是:可以! 首先Windo...
  • flydycfly
  • flydycfly
  • 2016年11月25日 15:01
  • 3546

利用计划任务实现关机创建与启动删除用户

利用计划任务启动利用计划任务实现关机创建与启动删除用户一、设计目标 自动创建与删除用户,用于隐秘登陆达到获取目标主机的信息 避免被攻击者用户发现所创建的用户 具有极大的可实施性,且灵活便捷...
  • qq_31481187
  • qq_31481187
  • 2017年02月26日 22:24
  • 5047

【定时任务|开机启动】Windows Server 2008/2012 计划任务配置(任务计划程序)每分钟执行BAT

转载自:http://www.php-note.com/article/detail/85 打开计划任务快捷方式(在 “管理工具”内): C:\ProgramData\Micros...
  • happymagic
  • happymagic
  • 2016年07月05日 17:39
  • 5375

WDCP主机管理系统添加自动重启WEB服务的计划任务

WDCP是国内知名的Linux主机管理系统,因其简单的操作、强大的功能深受很多linux主机新手的喜爱,系统运行久了产生的临时数据会占用内存的资源,造成性能下降,我们可以通过WDCP面板中的“服务重启...
  • langyu1021
  • langyu1021
  • 2016年01月19日 08:57
  • 1129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在WEB程序中轻松执行计划任务(多线程)
举报原因:
原因补充:

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