asp.net web定时器实现及注意事项

在web程序上实现定时器,有一定难度,浏览器端其实只需要使用js的定时器就可以实现,但服务端如何实现呢?都是使用Global.asax加Timer 实现的,但很多文章却没有提到这种设计的问题。

基本代码很简单:

Global.asax文件内容:

 System.Timers.Timer timer = null;
    void Application_Start(object sender, EventArgs e)
    {
        if (timer != null)
        {
            timer.Stop();
            timer.Close();
            timer = null;
        }
        int Interval = 1000 * 60 * 10;//十分钟
        timer = new System.Timers.Timer(Interval);//十分钟
        timer.Elapsed += new System.Timers.ElapsedEventHandler(Send);
        timer.Interval = Interval;
        timer.Enabled = true;
        timer.Start();       

        DHC.EAS.Common.LogInfo.Info("当前的应用正被初始化......");
        // 在应用程序启动时运行的代码6
       // Castle.ActiveRecord.Framework.Config.XmlConfigurationSource source = new Castle.ActiveRecord.Framework.Config.XmlConfigurationSource("../../appconfig.xml");
        IConfigurationSource source = System.Configuration.ConfigurationManager.GetSection("activerecord") as IConfigurationSource;
        Castle.ActiveRecord.ActiveRecordStarter.Initialize(System.Reflection.Assembly.Load("Eas.Entity"), source);//可以针对任何在该程序集下的类  

        DHC.EAS.Common.LogInfo.Info("当前的应用初始化完毕.");
    }
    public void Send(object sender, System.Timers.ElapsedEventArgs e)
    {
        DHC.EAS.Bo.SendMsg.Send();
    } 

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {

    }
    void Application_End(object sender, EventArgs e)
    {
        //  在应用程序关闭时运行的代码
        DHC.EAS.Common.LogInfo.Info("当前的应用被关闭");
        new DHC.EAS.Common.AppException("当前的应用被关闭");
        if (timer != null)
        {
            timer.Stop();
            timer.Close();
            timer = null;
        }
    }

    void Application_Error(object sender, EventArgs e)
    {
        // 在出现未处理的错误时运行的代码
        Exception ex = Server.GetLastError().GetBaseException();
        new DHC.EAS.Common.AppException("当前的应用发生错误",ex);
        //处理完及时清理异常
        Server.ClearError();
    }

    void Session_Start(object sender, EventArgs e)
    {
        // 在新会话启动时运行的代码
        //DHC.EAS.Common.LogInfo.Info("回话时间间隔(分钟)" + Session.Timeout.ToString());
        //DHC.EAS.Common.LogInfo.Info("开始一个Session = " + Session.SessionID);
    }

    void Session_End(object sender, EventArgs e)
    {
        // 在会话结束时运行的代码。
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
        // 或 SQLServer,则不会引发该事件。
        //DHC.EAS.Common.LogInfo.Info("结束一个Session = " + Session.SessionID);

    }

其实这样做有两点需要考虑1 Application_Start必须发生,2 IIS可能进行回收,导致发生Application_End事件

1Application_Start必须发生

要求必须有用户访问网页,如果没有人访问网页,则Application_Start不会发生,timer不会启动,定时也就无从谈起。

2Application_End事件

例如发布了文件,修改了webconfig等都会导致Application_End事件,当然还有长时间没人访问,IIS的回收机制也会导致。然后timer也就不存在了,定时也就无从谈起。其实在这个之后可以通过代码访问自己的网站,保证Application_End事件发生后,Application_Start发生。

其实还有人提出使用HttpRuntime.Cache,就是添加一个变量,设定一个过期时间,在过期时通过回调函数调用需要的操作。这种方式能不能用,我没有测试,理论上可行,但个人感觉还是会存在上边的问题。

其实这种定时操作,我个人还是建议使用服务程序去处理。

HttpRuntime.Cache定时参考

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 13:36:55

asp.net web定时器实现及注意事项的相关文章

Visual Studio中用于ASP.NET Web项目的Web服务器

当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们. 利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Express.Internet Information Services (IIS).外部主机或自定义 Web 服务器. 您可以将其中任何一种 Web 服务器用于基于文件的 Web 应用程序项目. 对于基于文件的网站项目,您可以使用 IIS Express. 本主题介绍每种 Web 服务器以及如何选择要用

Visual Studio 中用于 ASP.NET Web 项目的 Web 服务器

Visual Studio 中用于 ASP.NET Web 项目的 Web 服务器 当您在 Visual Studio 中开发 Web 项目时,需要 Web 服务器才能测试或运行它们.             利用 Visual Studio,您可以使用不同的 Web 服务器进行测试,包括 IIS Express.Internet Information Services (IIS).外部主机或自定义 Web 服务器.  您可以将其中任何一种 Web 服务器用于基于文件的 Web 应用程序项目.

(转载)提高ASP.NET Web应用性能的技巧

在这篇文章中,将介绍一些提高 ASP.NET Web 应用性能的方法和技巧.众所周知,解决性能问题是一项繁琐的工作,当出现性能问题,每个人都会归咎于编写代码的开发人员. 那性能问题到底该如何解决?以下是应用系统发布前,作为 .NET 开发人员需要检查的点. 1.debug=「false」 当创建 ASP.NET Web应用程序,默认设置为「true」.开发过程中,设置为「true」是非常有用多,但在应用程序发布部署时,需将其设置为「false」. ? 1 <compilation default

Step by Step 配置使用HTTPS的ASP.NET Web应用[转载]

原创地址:http://www.cnblogs.com/jfzhu/p/4064654.html 转载请注明出处 有关HTTPS.SSL以及SSL证书的工作原理,参见 <HTTPS那些事(一)HTTPS原理> <HTTPS那些事(二)SSL证书> <HTTPS那些事(三)攻击实例与防御> 本文将演示如何在IIS中配置一个HTTPS的ASP.NET Web Application. (1)打开Internet Information Services (IIS) Mana

ASP.NET Web API 2基于令牌的身份验证

基于令牌的认证 我们知道WEB网站的身份验证一般通过session或者cookie完成的,登录成功后客户端发送的任何请求都带上cookie,服务端根据客户端发送来的cookie来识别用户. WEB API使用这样的方法不是很适合,于是就有了基于令牌的认证,使用令牌认证有几个好处:可扩展性.松散耦合.移动终端调用比较简单等等,别人都用上了,你还有理由不用吗? 下面我们花个20分钟的时间来实现一个简单的WEB API token认证: Step 1: 新建一个空的WEB API项目,项目名称就设置为

Asp.Net Web API 2第四课——HttpClient消息处理器

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web API第二课:CRUD操作http://www

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tutorial-building-asp-net-

基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, 特别各种APP万花齐放的今天,对API使用者身份角色验证是不能避免的(完全开发的API不需要对使用者身份角色进行管控,可以绕过),这篇文章就来谈谈基于令牌TOKEN身份验证的实现. 问题: 对于Web API的选择性的开放,使用者无论使用AJAX,还是HttpClient对接,总要对使用者的身份角色

[转] ASP.NET WEB API程序在VS启动或发布到IIS后启动后发生 - Could not load file or assembly &#39;System.Web.Http.WebHost’异常,无法正常访问

Just do Copy Local = true in the properties for the assembly(System.Web.Http.WebHost) and then do a redeploy, it should work fine. http://stackoverflow.com/questions/20323107/could-not-load-file-or-assembly-system-web-http-webhost-after-published-to-