• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
初出茅庐
我的技术之路....每天前进一小步
博客园    首页    新随笔    联系   管理    订阅  订阅

asp.net forums中定时器的应用

 

在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小时将最新的数据列表生成静态的文本。

posted @ 2006-01-24 14:33  Cheek G  阅读(351)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3