【ASP.NET 进阶】定时执行任务

原理:利用全局应用程序类 Global.asax 和 System.Timers.Timer  类定时处理任务。

示例效果图:

其 Global.asax 类代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading;
using System.Timers;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace TimingTask
{
    /**
     *原理:Global.asax 可以是asp.net中应用程序或会话事件处理程序,
     *我们用到了Application_Start(应用程序开始事件)和Application_End(应用程序结束事件)。
     *当应用程序开始时,启动一个定时器,用来定时执行任务YourTask()方法,
     *这个方法里面可以写上需要调用的逻辑代码,可以是单线程和多线程。
     *当应用程序结束时,如IIS的应用程序池回收,让asp.net去访问当前的这个web地址。
     *这里需要访问一个aspx页面,这样就可以重新激活应用程序。
     */
    public class Global : System.Web.HttpApplication
    {
        //在应用程序启动时运行的代码
        protected void Application_Start(object sender, EventArgs e)
        {
            //定时器
            System.Timers.Timer myTimer = new System.Timers.Timer(2000);
            myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
            myTimer.Enabled = true;
            myTimer.AutoReset = true;
        }
        private void myTimer_Elapsed(object source, ElapsedEventArgs e)
        {
            try
            {
                RunTheTask();
            }
            catch (Exception ex)
            {
                WebForm1.html = ex.Message;
            }
        }

        private void RunTheTask()
        {
            //在这里写你需要执行的任务
            WebForm1.html = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":AutoTask is Working!";
        }

        // 在新会话启动时运行的代码
        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }
        // 在出现未处理的错误时运行的代码
        protected void Application_Error(object sender, EventArgs e)
        {

        }
        // 在会话结束时运行的代码。
        protected void Session_End(object sender, EventArgs e)
        {
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
            // 或 SQLServer,则不会引发该事件
        }
        //  在应用程序关闭时运行的代码
        protected void Application_End(object sender, EventArgs e)
        {
            WebForm1.html = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Application End!";

            //下面的代码是关键,可解决IIS应用程序池自动回收的问题  

            Thread.Sleep(1000);

            //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
            string url = "WebForm1.aspx";
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
            Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
        }
    }
}

然后用 WebForm 页面输出定时效果:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TimingTask
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        public static String html = "";
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                GetDataBind();
            }
        }

        private void GetDataBind()
        {
            for (int i = 0; i <10; i++)
            {
                System.Threading.Thread.Sleep(1000);
                Response.Write(html+"<br />");
            }
        }
    }
}
时间: 2024-10-08 03:01:20

【ASP.NET 进阶】定时执行任务的相关文章

Asp.net Global 定时执行

在复杂的业务应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件,定期处理用户状态信息,支付系统中定期同步异常账单等等,我们称之为计划任务. 实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程,采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是不错的解决方案.但是,以上这些都需要有服务器的权限才能进行,而对于虚拟主机客户使用的Web应用程序来说,这些方法实现起来

【ASP.NET 进阶】定时执行任务实现 (定时读取和修改txt文件数字内容,无刷新显示结果)

现在有很多网站或系统需要在服务端定时做某件事情,如每天早上8点半清理数据库中的无效数据等等,Demo 具体实现步骤如下: 0.先看解决方案截图 1.创建ASP.NET项目TimedTask,然后新建一个全局应用程序类文件 Global.asax 2.然后在Application_Start 事件中 启动定时器,如需要每隔多少秒来做一件事情,即在后台执行,与客户端无关,即使客户端全部都关闭,那么后台仍然执行,具体代码如下: using System; using System.Collection

基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

在之前的文章<推荐一个简单.轻量.功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler>和<简单.轻量.功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇>中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件.今天再给大家介绍一款关于定时任务调度执行的组件–Quartz.NET,Quartz.Net是Java版Quartz的.NET实现. 相对FluentSchedule

使用ASP.NET实现Windows Service定时执行任务

转载http://blog.csdn.net/yanghua_kobe/article/details/6937816 我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows service?我们经常需要运行一些维护性的任务或者像发送提醒邮件给用户这样的定时任务.这些仅仅通过使用Windows Service就可以完成.Asp.net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码.所以,我们不得不构建自己的windows service来运行那些定时任

ASP.NET MVC4计划任务实现方法(定时执行某个功能)

系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在Application_Start方法最下面加入: //定义定时器 //1000表示1秒的意思 System.Timers.Timer myTimer = new System.Timers.Timer(1000); //TaskAction.SetContent 表示要调用的方法 myTimer.

ASP.NET MVC计划任务实现方法(定时执行某个功能)

系统中定时执行某个任务是比较常用的功能,如一个部门定期向上级部门上报数据是一个典型的例子,下面就简单说说在.net mvc中如何实现定时执行某个功能的方法. 1.首先修改Glocal.asax文件,在Application_Start方法最下面加入: //定义定时器 //1000表示1秒的意思 System.Timers.Timer myTimer = new System.Timers.Timer(1000); //TaskAction.SetContent 表示要调用的方法 myTimer.

使用ASP.NET实现定时计划任务,不依靠windows服务

我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows service?我们经常需要运行一些维护性的任务或者像发送提醒邮件给用户这样的定时任务.这些仅仅通过使用Windows Service就可以完成.Asp.net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码.所以,我们不得不构建自己的windows service来运行那些定时任务.但是在一个共享的托管环境下,我们并不总是有机会部署我们自己的windwos service到我们托管服务提供商的we

在ASP.NET应用中执行后台任务

为什么要在ASP.NET应用中执行后台任务? 主要是考虑使用后台任务来处理CPU或IO密集的计算. 下面是一些常见的后台任务: 大量的提醒和新闻邮件发送 图片和视频处理(比如批量创建缩略图.格式转换) 从外部文件导入大量数据或导出数据(RSS聚合) 文件操作(创建归档.清理临时文件.日志文件维护) 定时生成自动化报告 数据库维护 -- ASP.NET不知道任何后台线程比如一个计时器或者其他,它只知道和request相关的操作.事实上,在后台长时间的运行某些任务实在不是web server该做的事

iOS: 零误差或极小误差的定时执行或延迟执行?

问题如下: 节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密.对两者间隔要求不能超过0.02秒或更低. 目前使用了 GCD 中的 asyncAfter(deadline:)方法,不过误差总是要大于0.05秒,并且还无法保证误差会不会传递下去.请问有更好的方式来解决误差吗? var time = Date().timeIntervalSince1970 let dq = DispatchQueue(label: "queue", qos: