asp.net forums中定时器的应用

asp.net|定时

在Asp.Net中使用定时器,破宝之前已有Blog写过《在 ASP.NET 中使用计时器(Timer)》,这里主要针对Asp.Net Forums来说一下其具体实现。

在Asp.Net Forums中,对定时器有如下应用:
1. 更新论坛统计信息
2. 定时索引指定条数的帖子
3. 定时群发队列中的邮件

Forums中对定时器的调用是放在自定义HttpModule的Init方法中(如果您没有使用HttpModule,也可以在Globals.aspx中的Application_OnStart 中调用定时器)。

       // 定时器 
        static Timer statsTimer; 
        static Timer emailTimer; 
 
        // 定时间隔 
        private long EmailInterval = ForumConfiguration.GetConfig().ThreadIntervalEmail * 60000; 
        private long StatsInterval = ForumConfiguration.GetConfig().ThreadIntervalStats * 60000; 
 
        public String ModuleName {  
            get { return "ForumsHttpModule"; }  
        }     
 
 
        // ********************************************************************* 
        //  ForumsHttpModule 
        // 
        /**//// <summary> 
        /// Initializes the HttpModule and performs the wireup of all application 
        /// events. 
        /// </summary> 
        /// <param name="application">Application the module is being run for</param> 
        public void Init(HttpApplication application) {  
 
            // Wire-up application events 
            // 
            // 略去其他代码 
             
            ForumConfiguration forumConfig = ForumConfiguration.GetConfig(); 
 
            // 如果使用定时器并且定时器还没初始化 
            if( forumConfig != null 
            &&  forumConfig.IsBackgroundThreadingDisabled == false ) { 
                if (emailTimer == null) 
                    // 新建定时器 
                    // 新建一个TimerCallback委托,具体要执行的方法在ScheduledWorkCallbackEmailInterval中 
                    emailTimer = new Timer(new TimerCallback(ScheduledWorkCallbackEmailInterval), application.Context, EmailInterval, EmailInterval); 
 
                if( forumConfig.IsIndexingDisabled == false  
                &&    statsTimer == null ) { 
                    statsTimer = new Timer(new TimerCallback(ScheduledWorkCallbackStatsInterval), application.Context, StatsInterval, StatsInterval); 
            } 
        } 
        } 
 
        /**//// <summary> 
        /// 释放定时器 
        /// </summary> 
        public void Dispose() { 
            statsTimer = null; 
            emailTimer = null; 
        } 
 
        Timer Callbacks
    #region Timer Callbacks 
        /**//// <summary> 
        /// 定时发送队列中待发送的邮件 
        /// </summary> 
        private void ScheduledWorkCallbackEmailInterval (object sender) { 
            try { 
                // 当处理邮件时暂停定时器 
                emailTimer.Change( System.Threading.Timeout.Infinite, EmailInterval ); 
 
                // 发送队列中的邮件 
                // 
                Emails.SendQueuedEmails( (HttpContext) sender); 
 
 
                // 更新匿名用户 
                // 
                Users.UpdateAnonymousUsers( (HttpContext) sender); 
            } 
            catch( Exception e ) { 
                ForumException fe = new ForumException( ForumExceptionType.EmailUnableToSend, "Scheduled Worker Thread failed.", e ); 
                fe.Log(); 
            } 
            finally { 
                // 重新启动定时器 
                emailTimer.Change( EmailInterval, EmailInterval ); 
            } 
        } 
 
        /**//// <summary> 
        /// 定时索引帖子和定时更新论坛统计信息 
        /// </summary> 
        private void ScheduledWorkCallbackStatsInterval(object sender) { 
            try { 
                // 休眠定时器 
                statsTimer.Change( System.Threading.Timeout.Infinite, StatsInterval ); 
 
                // 每次索引100篇帖子 
                // 
                Search.IndexPosts( (HttpContext) sender, 100); 
 
                // 更新论坛统计信息 
                SiteStatistics.LoadSiteStatistics( (HttpContext) sender, true, 1 ); 
            } 
            catch( Exception e ) { 
                ForumException fe = new ForumException( ForumExceptionType.UnknownError, "Failure performing scheduled statistics maintenance.", e ); 
                fe.Log(); 
            } 
            finally { 
                // 唤醒定时器 
                statsTimer.Change( StatsInterval, StatsInterval); 
            } 
        } 
        #endregion
其实稍加改进就可以应用到我们自己的项目中,例如前不久刚做一个项目,因为数据量过于庞大,每次从数据库取非常慢,然后改成使用定时器,每隔12小时将最新的数据列表生成静态的文本。

 

 

时间: 2024-09-20 01:02:39

asp.net forums中定时器的应用的相关文章

在ASP.NET FORUMS中一种存储和读取思路

asp.net 今天在ASP.NET FORUMS中发现了一种至少对于我来说特殊的存储思路,那就是通过BinaryFormatter将多个字段进行图像序列化,作为图像存储进数据库,然后通过转换成内存流再读出来,这种做法对于需要存储多个字段的时候,非常的方便.不用再写一长串的变量赋值.首先看一看,与管理设置页面相对应的一个实例类AspNetForums.Components.SiteSettings() 在SiteSettings()定义了Hashtable settings = new Hash

浅析ASP.NET FORUMS中缓存机制的应用

asp.net|缓存 浅析ASP.NET FORUMS中缓存机制的应用 在ASP.NET中有三种缓存机制,我在这里主要提到的是ASP.NET FORUMS中使用的缓存API Cache对象Cache对象可以说在ASP.NET FORUMS中无所不在,以SiteUrls()类为例在构造函数中有如下代码if (HttpRuntime.Cache[cacheKey] == null) { . .System.Web.Caching.CacheDependency dep = new System.We

Asp.Net Forums中对.Net中序列化和反序列化的应用

asp.net 在Forums中,有些内容是不固定的,例如用户资料,除了一些基本资料,可能还要有一些其他资料信息,例如MSN.个人主页.签名档等,一般对于这样的都是每一个属性对应于数据库中的一个字段.但是如果以后我们因为需要增加一些属性,例如QQ号.Blog地址等,如果还是用这种增加数据表字段的方法,那么将会频繁的修改数据库表结构.存储过程.数据库访问的程序. 或许您也遇到过类似问题,看Forums中是怎么借用.Net的序列化和反序列化来解决的:例如我需要在用户资料里面增加QQ号这个属性,那么我

《Asp.Net Forums2.0深入分析》之 Asp.Net Forums是如何实现代码分离和换

asp.net|代码分离 在Visual Studio中开发Web项目,Web 窗体页由两部分组成:视觉元素(HTML.服务器控件和静态文本)和该页的编程逻辑. 一般将这两个组成部分分别存储在一个单独的文件中.可视元素在一个 .aspx 文件中创建,而代码位于一个单独的类文件中(.aspx.vb 或 .aspx.cs).或者有时候也会在同一文件中创建视觉元素和代码. 而在Asp.Net Forums的Web窗体页中没有找到我们熟悉的.aspx.cs文件,也没有发现任何C#代码,取而代之是一个个控

ASP.NET Forums 页面模型分析

asp.net|页面 ASP.NET 提供两个用于管理可视元素和代码的模型,即单文件页模型和代码隐藏页模型.具体内容可以参考MSDN(ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/81b13e7a-b95b-4285-906f-d2dd77411417.htm). 在ASP.NET Forums的页面中使用了代码隐藏页模型,但是与典型的代码隐藏页模型又稍有区别. Default

ASP.NET Forums与现有系统整合方案示例

Asp.Net Forums以下简称ANF,版本2.0,本文系数流水帐,只是记录了一下今的工作,没啥技术含量. 已有系统已经有自己的一套用户系统,需要挂接ANF,要求在已有系统用户注册,登录,修改密码时,在ANF中也做出相应反映.不要求ANF的用户变化影响已有系统,只是单向同步. 在尽量少动已有代码的情况下找一种简单的方式来完成整合.之前看了宝玉的CnForums和已有系统的整合方案,最后偷懒决定在已有系统上述动作结束后将用户相关信息和操作类型附加在url后面传给一个新建页来处理在ANF中执行相

ASP.NET Forums页面模型分析

具体内容可以参考MSDN(ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_aspnetcon/html/81b13e7a-b95b-4285-906f-d2dd77411417.htm). 在ASP.NET Forums的页面中使用了代码隐藏页模型,但是与典型的代码隐藏页模型又稍有区别. Default.aspx的内容如下: <%@ Page Language="C#" %> <%

asp.net web中如何在button中触发timer控件呢

问题描述 asp.net web中如何在button中触发timer控件呢 在网上找的都是 this.timer1.start(); 但是我是web的程序,不好使,求大神们赐教 解决方案 用js定时器,不能用服务器定时器. 解决方案二: 用客户端的setTimeout/setInterval来定时执行代码

在asp.net页面中怎么使用多个timer控件!!

问题描述 在asp.net页面中怎么使用多个timer控件!!我想在同一个页面中使用多个...... 解决方案 解决方案二:拉2个解决方案三:定时器是干什么的?asp.net为毛还要定时器?解决方案四:引用楼主u010198515的回复: 在asp.net页面中怎么使用多个timer控件!!我想在同一个页面中使用多个...... Timer控件会引起回发,这样另一个Timer就没有用了.解决方案五:asp.net并不是时下流行的"单页应用程序"机制,而是传统(古老)的"一遍遍