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


相关文章
|
23天前
|
安全 JavaScript Java
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
33 12
AppSpider Pro 7.5.015 for Windows - Web 应用程序安全测试
|
7天前
|
自然语言处理 安全 测试技术
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
26 0
HCL AppScan Standard 10.8.0 (Windows) - Web 应用程序安全测试
|
5月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
326 2
|
4月前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
183 62
|
3月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
173 13
|
4月前
|
监控 前端开发 JavaScript
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
74 6
|
4月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
141 3
|
4月前
|
数据可视化 数据库 开发者
使用Dash构建交互式Web应用程序
【10月更文挑战第16天】本文介绍了使用Python的Dash框架构建交互式Web应用程序的方法。Dash结合了Flask、React和Plotly等技术,让开发者能够快速创建功能丰富的数据可视化应用。文章从安装Dash开始,逐步介绍了创建简单应用程序、添加交互元素、部署应用程序以及集成更多功能的步骤,并提供了代码示例。通过本文,读者可以掌握使用Dash构建交互式Web应用程序的基本技巧和高级功能。
158 3
|
5月前
|
JavaScript 前端开发
如何使用Vue.js构建响应式Web应用程序
【10月更文挑战第9天】如何使用Vue.js构建响应式Web应用程序
|
5月前
|
前端开发 JavaScript 测试技术
构建响应式Web应用程序:React实战指南
【10月更文挑战第9天】构建响应式Web应用程序:React实战指南

热门文章

最新文章