在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用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。

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

下面就简单介绍一下在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,定时刷新来检查我们所记录的数据:

<%@ 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>

C#实现Web应用程序定时启动任务相关推荐

  1. java应用程序无法启动,Apache Tomcat / 6.0.32 - Web应用程序无法启动

    8-giu-2017 9.41.12 org.apache.catalina.core.StandardContext start GRAVE:Error listenerStart 8-giu-20 ...

  2. 批处理篇---windows bat程序定时启动和关闭

    1. 运行的bat程序 app_test_time.bat 方法一: call activate pytorch_gpuset python_path=C:\Program_conda\envs\py ...

  3. web应用程序和web网站_Web应用程序和移动应用程序的基本启动清单

    web应用程序和web网站 by Ben Cheng 通过本诚 Web应用程序和移动应用程序的基本启动清单 (The Essential Launch Checklist for Web Apps a ...

  4. centos 定时删除文件_Centos定时启动和清除任务

    因为需要定时并发执行任务,所以查到了crontab这个工具,介绍一下其用法: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=roo ...

  5. 为什么将表格的method改为post后就无法工作_用Python将Keras深度学习模型部署为Web应用程序...

    构建一个很棒的机器学习项目是一回事,但归根结底,你希望其他人能够看到你的辛勤工作.当然,你可以将整个项目放在GitHub上,但是怎么让你的祖父母也看到呢?我们想要的是将深度学习模型部署为世界上任何人都 ...

  6. .NET平台下WEB应用程序的部署(安装数据库和自动配置,启动条件)

    转自:http://blog.csdn.net/lihonggen0/article/details/13654 首先,创建一个安装和部署项目.步骤如下: 1.在 "解决方案资源管理器 &q ...

  7. Windows每天定时启动应用程序

    Windows每天定时启动应用程序 1.win+R打开此窗口,输入compmgmt.msc 2.创建一个基本任务 3.配置任务 使用bat文件进行应用程序的定时启动与关闭 @echo off chcp ...

  8. 计算机启动应用程序的方法,win10设置电脑定时启动某个应用程序的办法

    win10设置电脑定时启动某个应用程序的办法? 虽然win10系统已经发布投入使用很长一段时间了,但是它的功能还有许多人不熟悉.只是单纯的用系统,也无好好去研究它到底有啥功能的.其实win10有许多功 ...

  9. 【亚马逊云科技】基于Cloud9启动一个Web应用程序

    目录 一.[亚马逊云科技]介绍 二.[亚马逊云科技]AWS Cloud9 1. [亚马逊云科技]AWS Cloud9介绍 2. [亚马逊云科技]AWS Cloud9应用 3. [亚马逊云科技]AWS ...

最新文章

  1. 零基础学java培训怎么选择学校
  2. json-lib把XML转化为json
  3. SpringBoot+zxing+Vue实现前端请求后台二维码图片
  4. list删除某个元素_Redis对象——列表(List)
  5. tcpdump软件使用
  6. 电脑重装系统后提示invalid partition table怎么解决
  7. guava和commons_使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在...
  8. bzoj 1934 最小割
  9. java输出变量_Java笔记1: 输入输出与变量常量
  10. 环保牵手大数据 佛企需反向挖掘数据价值
  11. 机电传动与控制【2】
  12. 苹果手机中病毒显示无服务器,苹果手机浏览器提示中毒,如图?
  13. python批量裁剪图片
  14. 案例分析 | 优衣库DTC模式之全渠道零售
  15. 本文主要讲述如何开通自己的博客。若读者不想或已经知道如何开通使用博客,那么就可以跳过。 一直以来,想把自己在学习过程中遇到的问题及解决办法共享给志同道合的人,那么如何分享自己的见解呢?有如下方法
  16. c加加中print是什么意思_数学中质数和合数是什么意思
  17. 如果哈夫曼树有67个结点,则可知叶结点总数为
  18. 国内外语音识别研究的历史
  19. JAVA应用程序转换为Applet
  20. 软件性能测试、分析与调优实践之路_读书笔记(一)

热门文章

  1. 模拟红绿灯交替指示编程思路
  2. Dubbo中基于权重的随机算法
  3. [04] 前端构建工具区别
  4. vue.js - advance - render 函数小抄
  5. TYVJ P1091 等差数列 Label:dp
  6. 关于 Twing Hot Link 的一些事
  7. 很久没有回到我51的家啦!
  8. BCH收银APP已在Android系统上下载超10000次
  9. 诺贝尔奖得主Paul Krugman认可bch发展路线
  10. 最初的感动:各种应用和代码在BCH这里不断复活