Asp.Net(C#)自动执行计划任务的程序实例分析分享

 这篇文章主要介绍了Asp.Net(C#)自动执行计划任务的程序实例分析,有需要的朋友可以参考一下

在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用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:InetpubwwwrootCSTest为物理路径 
string p = @"F:InetpubwwwrootCSTest"; 
//我们在虚拟目录的根目录下建立SchedulerJob文件夹,并设置权限为匿名可修改, 
//SchedulerJob.txt就是我们所写的文件 
string FILE_NAME = p+ "SchedulerJobSchedulerJob.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("rn"+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  
 
需要说明的是,以上只是在Web应用程序中执行计划任务的简单例子,对于多个任务来说,需要在不同的线程内进行工作,对计划的安排也是很简单的,实际还需要站点堵塞,当机的情况。另外这里也没有进行错误的处理等工作,相信大家会写出更加完美的代码的。
 
点击下载源码:http://xiazai.jb51.net/201401/yuanma/AutoRun(jb51.net).zip
 
资源回收,当web没有人访问的时候,定时器会回收停掉
不知道在 Application_End 时自动访问一次有用么,我这前测试了几天这个方法都可以行。
 
代码如下:
void Application_End(object sender, EventArgs e)
{
///在应用程序关闭时运行的代码
webSocket.Stop();
Thread.Sleep(15000);
try
{
string url = "http://127.0.0.1/404.aspx?mater=" + DateTime.Now.Ticks;
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse())
{
Stream resStream = response.GetResponseStream();
}
}
catch (Exception ex)
{
//异常时,等15s,再访问一次。
Thread.Sleep(15000);
string url = "http://127.0.0.1/404.aspx?mater=" + DateTime.Now.Ticks;
HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse())
{
Stream resStream = response.GetResponseStream();
}
 
Hangjing.AppLog.AppLog.Error("Application_End:" + ex);
}
}

时间: 2024-08-04 10:06:07

Asp.Net(C#)自动执行计划任务的程序实例分析分享的相关文章

Asp.Net(C#)自动执行计划任务的程序实例分析分享_实用技巧

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

Asp.Net(C#)自动执行计划任务的程序实例分析

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

Oracle中获取执行计划的几种方法分析

以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下   1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划表中,语句如下: explain plan for SQL语句然后,在计划表中查询刚刚生成的执行计划,语句如下: select * from table(

Oracle中获取执行计划的几种方法分析_oracle

1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划表中,语句如下:explain plan for SQL语句然后,在计划表中查询刚刚生成的执行计划,语句如下:select * from table(dbms_xplan.display);注意:Explain plan只生成执行计划,并不会真正

一个执行计划解析的小问题分析

前几天,一个开发的同学让我帮忙做一个大查询,给了我一个数据列表,里面的ID有几万个,提供了一个SQL语句,看这情况还得我自己来解析生成相关的SQL了. 假设ID列表为: T100 T200 T300 SQL语句为: select peak_transaction_id,cash ,req_time  ,back_time  from peak_new.peak_detail where peak_transaction_id=?; 对我来说拼成动态SQL也是分分钟,但是这种方式不推荐,还是推荐使

通过分析SQL语句的执行计划优化SQL(二)

优化|语句|执行 第5章 ORACLE的执行计划 背景知识:        为了更好的进行下面的内容我们必须了解一些概念性的术语: 共享sql语句    为了不重复解析相同的SQL语句(因为解析操作比较费资源,会导致性能下降),在第一次解析之后,ORACLE将SQL语句及解析后得到的执行计划存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享.因此,当你执行一个SQL语句(有时被称为一个

注册表取消启动时执行计划任务

  当Windows启动后,计划任务会自动被执行.通常情况下并不需要此功能,可以将此功能关闭. 运行注册表,展开HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServices,找到键值项SchedulingAgent值设置为mstask.exe(执行计划任务). 提示:删除"SchedulingAgent"键值项,就可以关闭自动执行计划任务功能.

SQL Server 数据库自动执行管理任务_MsSql

当满足这些指定的条件,则数据库会自动运行管理员指定的操作.使用自动管理来处理日常事务,则让管理员可以抽出时间去关注其他的事情,如数据库优化等等更加具有价值的作业. 计划就是自动化管理组件的一个成员.计划指定了作业运行的时间.多个作业可以根据一个计划运行;多个计划也可以应用到一个作业.但是这个时间跟我们普通上的几点几分又有差异.这个时间不仅指特定的日期或者时间,而且还可以表示特定的时间.如当SQL Server代理启动的时候或者服务器的CPU使用率处于定义的空闲状态水平时.也就是说,这里指的时间计

Oracle查看执行计划的几种方法

Oracle查看执行计划的几种方法   一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性.启用AUTOTRACE后,SQL*Plus会自动收集执行过的SQL语句的执行计划.性能统计数据等,并在语句执行结束后显示在SQL*Plus中. DBA用户可以直接使用AUTOTRACE功能,但是如果用户没有DBA权限,那么需要在SYS用户下执行plustrce.sql脚本,自动创建PLUSTRACE角色,再把PL