C#实现Web应用程序定时启动任务

简介:

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

由于ASP.NET站点是作为Web应用程序运行的,它并不受线程的限制,因此我们可以非常方便地在Application_Start和Application_End事件中建立和销毁一个计划任务。

ASP.NET 框架应用程序在第一次向服务器发出请求时创建,在此之前,不执行 ASP.NET 代码。当第一个请求发出后,将创建一个 HttpApplication 实例池并引发 Application_Start 事件。
HttpApplication 实例处理该请求以及后面的请求,直到最后一个实例退出并引发 Application_End 事件。

IIS应用池回收造成Application_Start中定时执行程序停止的问题的解决方法

原理就是在应用程序结束时发出一个Web请求访问网站,启动Application_Start。

 

 
  1. void Application_End(object sender, EventArgs e)   
  2. {   
  3. // 在应用程序关闭时运行的代码   
  4. //解决应用池回收问题   
  5. System.Threading.Thread.Sleep(5000);   
  6. string strUrl = "网站地址";   
  7. System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(strUrl);   
  8. System.Net.HttpWebResponse _HttpWebResponse = (System.Net.HttpWebResponse)_HttpWebRequest.GetResponse();   
  9. System.IO.Stream _Stream = _HttpWebResponse.GetResponseStream();//得到回写的字节流   

下面就简单介绍一下在Web站点实现计划任务的方法。我们的例子是定时往文件里添加信息,作为例子,这里把当前的时间定时地写入文件中。

一个计划任务的工作单元称之为一个任务(Job),下面的代码描述了对所有任务都可以被调度引擎计划执行的一个通用的接口,这里的每个任务实现了Execute方法,供调度引擎进行调用:

public interface ISchedulerJob
{
void Execute();
}

如前所述,我们的例子是实现往文件写如字符日期,下面就是实现这一任务的方法:

 

 
  1. public class SampleJob : ISchedulerJob  
  2. {  
  3. public void Execute()  
  4. {  
  5. //文件保存的物理路径,CSTest为虚拟目录名称,F:\Inetpub\wwwroot\CSTest为物理路径  
  6. string p = @"F:\Inetpub\wwwroot\CSTest";  
  7. //我们在虚拟目录的根目录下建立SchedulerJob文件夹,并设置权限为匿名可修改,  
  8. //SchedulerJob.txt就是我们所写的文件  
  9. string FILE_NAME = p+ "\\SchedulerJob\\SchedulerJob.txt";  
  10. //取得当前服务器时间,并转换成字符串  
  11. string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss");  
  12. //标记是否是新建文件的标量  
  13. bool flag = false;  
  14. //如果文件不存在,就新建该文件  
  15. if (!File.Exists(FILE_NAME))  
  16. {  
  17. flag = true;  
  18. StreamWriter sr = File.CreateText(FILE_NAME);  
  19. sr.Close();  
  20. }  
  21. //向文件写入内容  
  22. StreamWriter x = new StreamWriter(FILE_NAME,true,System.Text.Encoding.Default);  
  23. if(flag) x.Write("计划任务测试开始:");  
  24. x.Write("\r\n"+c);  
  25. x.Close();  
  26. }  

接下来,我们建立一个配置对象,告诉调度引擎执行什么任务和执行的时间间隔。

 

 
  1. public class SchedulerConfiguration  
  2. {  
  3. //时间间隔  
  4. private int sleepInterval;  
  5. //任务列表  
  6. private ArrayList jobs = new ArrayList();  
  7.  
  8. public int SleepInterval { get { return sleepInterval; } }  
  9. public ArrayList Jobs { get { return jobs; } }  
  10.  
  11. //调度配置类的构造函数  
  12. public SchedulerConfiguration(int newSleepInterval)  
  13. {  
  14. sleepInterval = newSleepInterval;  
  15. }  

下面就是调度引擎,定时执行配置对象的任务

 

 
  1. public class Scheduler  
  2. {  
  3. private SchedulerConfiguration configuration = null;  
  4.  
  5. public Scheduler(SchedulerConfiguration config)  
  6. {  
  7. configconfiguration = config;  
  8. }  
  9.  
  10. public void Start()  
  11. {  
  12. while(true)  
  13. {  
  14. //执行每一个任务  
  15. foreach(ISchedulerJob job in configuration.Jobs)  
  16. {  
  17. ThreadStart myThreadDelegate = new ThreadStart(job.Execute);  
  18. Thread myThread = new Thread(myThreadDelegate);  
  19. myThread.Start();  
  20. Thread.Sleep(configuration.SleepInterval);  
  21. }  
  22. }  
  23. }  


所有的准备工作已经完成,下面就是激活引擎的工作了。为了让我们的任务计划执行,我们在Global.asax.cs文件里的Applicatio_Start和Application_End里进行建立和销毁工作,首先建立一个调度进程运行的线程,我们这里的运行间隔时间为3秒钟。

 

 
  1. public System.Threading.Thread schedulerThread = null;  
  2. protected void Application_Start(Object sender, EventArgs e)  
  3. {  
  4. SchedulerConfiguration config = new SchedulerConfiguration(1000*3);  
  5. config.Jobs.Add(new SampleJob());  
  6. Scheduler scheduler = new Scheduler(config);  
  7. System.Threading.ThreadStart myThreadStart = new System.Threading.ThreadStart(scheduler.Start);  
  8. System.Threading.Thread schedulerThread = new System.Threading.Thread(myThreadStart);  
  9. schedulerThread.Start();  

最后还需要在程序退出时进行销毁:

 
  1. protected void Application_End(Object sender, EventArgs e)  
  2. {  
  3. if (null != schedulerThread)  
  4. {  
  5. schedulerThread.Abort();  
  6. }  

 

好了,在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>

本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078714


相关文章
|
2月前
|
安全 Devops 测试技术
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
49 0
AppSpider 7.5.018 for Windows - Web 应用程序安全测试
|
2月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
138 11
|
3月前
|
安全 测试技术 Linux
Acunetix v25.4 发布 - Web 应用程序安全测试
Acunetix v25.4 (Linux, Windows) - Web 应用程序安全测试
123 3
Acunetix v25.4 发布 - Web 应用程序安全测试
|
5月前
|
安全 JavaScript Java
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
68 12
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
|
4月前
|
自然语言处理 安全 测试技术
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
209 0
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
|
8月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
295 62
|
7月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
273 13
|
8月前
|
监控 前端开发 JavaScript
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
163 6
|
8月前
|
数据可视化 数据库 开发者
使用Dash构建交互式Web应用程序
【10月更文挑战第16天】本文介绍了使用Python的Dash框架构建交互式Web应用程序的方法。Dash结合了Flask、React和Plotly等技术,让开发者能够快速创建功能丰富的数据可视化应用。文章从安装Dash开始,逐步介绍了创建简单应用程序、添加交互元素、部署应用程序以及集成更多功能的步骤,并提供了代码示例。通过本文,读者可以掌握使用Dash构建交互式Web应用程序的基本技巧和高级功能。
326 3
|
9月前
|
JavaScript 前端开发
如何使用Vue.js构建响应式Web应用程序
【10月更文挑战第9天】如何使用Vue.js构建响应式Web应用程序

热门文章

最新文章