首页 > 编程 > .NET > 正文

asp.net forums中定时器的应用

2024-07-10 13:06:59
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 在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小时将最新的数据列表生成静态的文本。

     

     

    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表