文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院网络编程Asp.NetCommunity Server专题七: Job & Timer
精品推荐
特别推荐
·技巧实例:ASP.NET生成静态页面实现方法
·ASP.NET、JSP及PHP之间的抉择
·.net基础知识错误注意二十二点知识
·asp.net2.0学习历程 菜鸟到中级程序员的飞跃
·.NET基础知识-什么是.NET
·初学C#+ASP.NET+Oracle时积累的备忘点滴
·专家详解:复杂表达式的执行步骤
·asp.net中的加密方法
·DataGrid常见关注问题解决方案
·学习笔记 ASP.NET 5种页面转向法
·ASP.NET网络编程中经常会用到的27个函数集
·ASP.NET之上传文件管理策略
·专家:用.NET动态创建类的实例讲解
·ASP.NET WEB服务和Flash打造MP3播放器
·精通ASP.NET中弹出窗口技术
·asp.net常用代码
·asp.net创建文件夹的IO类的问题
·Asp.Net函数集
·Asp.net cache 简述
·如何最大限度提高.NET的性能 (续)
热点TOP10
·DataTable控件的使用
·ASP.NET上传文件的实例
·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
·asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)
·ASP.NET购物车的实现及结算处理
·在ASP.NET中防止注入攻击[翻译]
·使用ASP.NET2.0的ReportViewer查看RDLC报表
·asp.net程序中最常用的三十三种编程代码
·ASP.NET 2.0的导航控件treeview和menu的实例
·asp.net常用代码
·Lucene.net 实现全文搜索
·在C#后代码里使用IE WEB Control TreeView
·asp.net2.0学习历程 菜鸟到中级程序员的飞跃
·Access 通用数据访问类(asp.net 2.0 c#)
·.Net分页控件发布
·ASP.NET之上传文件管理策略
·AspNetPager分页控件--使用方法
·asp.net 2.0中gridview里嵌套dropdownlist
·ASP.net在线购物商城系统完全解析
·手把手教你在Win2003下配置ASP.NET开发环境

Community Server专题七: Job & Timer

日期:2007年7月8日 作者: 查看:[大字体 中字体 小字体]


在CSHttpModule.cs文件中的Init方法下有这样一行:

接着在Dispose方法中还有这么一行:

Job?什么是Job,在CS运行过程中有什么用途,又是如何运行的?这篇专题将叙述Job的工作流程.

你可以这里理解CS中的Job:“干一些零碎事情的钟点工”。

讲解之前要先了解一个接口:IDisposable,MSDN是这样定义的:定义一种释放分配的非托管资源的方法。当托管对象不再使用时,垃圾回收器会自动释放分配给该对象的内存,不过,进行垃圾回收的时间不可预知。另外,垃圾回收器对窗口句柄、打开的文件和流等非托管资源一无所知。

将此接口的 Dispose 方法与垃圾回收器一起使用来显式释放非托管资源。当不再需要对象时,对象的使用者可以调用此方法。非托管资源(unmanaged resource)?大致可以这样理解:类实例封装的对不受运行库管理的资源(窗口句柄、数据库连接等),这些类实例都必须实现IDisposable接口,如:SqlCommand 、SqlCeConnection、Timer等。当一个类实现IDisposable时,实例的正确用法是当对象不在需要时调用Dispose方法删除它,因此,在你实现一个类,而该类又包含其他实现IDisposable的类时,必须调用Dispose方法。这通常意味着在该类中你必须实现IDisposable。

注:C#语言对Disposable有特殊的支持,你经常会看到如下一段代码:


using(SqlConnection connection = new SqlConnection(connectionString))

{

    \\do something

}

这里的using就是对IDisposable接口的支持来实现对象清除。

言归正传,下面打开CommunityServerComponents项目中Configuration文件夹中的Job.cs:

public class Job : IDisposable

{

\\代码太长…

}

原来Job是实现了IDisposable的类,有了上面对IDisposable的解释不难理解,由于Job中调用了Timer,而Timer又是实现了IDisposable的类,Job类实现接口IDisposable是为了释放使用的Timer,即调用Timer中的Dispose()。看看以下的代码可以证实这一点:

public void Dispose()

{

    if(_timer!= null && !disposed)

    {

        lock(this)

        {

            _timer.Dispose();

            _timer = null;

            disposed = true;

        }

    }

}

还有必要对Timer类做一些简单的介绍:Timer是提供以指定的时间间隔执行方法的机制,说白了就是一个定时器。Timer可以使用 TimerCallback 委托指定希望 Timer时间到达时执行的方法。也就是说,如果定时器的时间到达了,将执行TimerCallback 委托指向的方法。

(注:创建计时器时,可以指定在第一次执行方法之前等待的时间量(截止时间)以及此后的执行期间等待的时间量(时间周期)。可以使用 Change 方法更改这些值或禁用计时器。)

我们看一下代码:

private Timer _timer = null;

public void InitializeTimer(Guid id)

{

     if(_timer == null && Enabled)

     {

         _timer = new Timer(new TimerCallback(timer_Callback), id,Interval, Interval);

     }

}

private void timer_Callback(object state)

{

    Guid id = (Guid)state;

    if(id != Jobs.Instance().CurrentID)

    {

        this.Dispose();

        return;

    }

    if(!Enabled)

        return;

    _timer.Change( Timeout.Infinite, Timeout.Infinite );

    ExecuteJob();

    if(Enabled)

        _timer.Change( Interval, Interval);

    else

        this.Dispose();

}

通过_timer = new Timer(new TimerCallback(timer_Callback), id,Interval, Interval);

先实例化了一个定时器,并制定了该定时器触发时候调用的方法是timer_Callback。

(前一个Interval指:

后一个Interval指:

)

在回调方法timer_Callback只要调用的是ExecuteJob()方法,该方法通过调用Job类的Jobs类中传递过来得xml节点信息,使用反射实例化一个具有IJob接口的类(IJob接口要求实现它的类都具有Execute方法),并且执行类中的Execute方法。我们分析一个实现了IJob的类,打开Components文件夹下的EmailJob.cs,该类中只有一个方法,就是Execute,该方法又调用Emails.cs下的SendQueuedEmails方法,主要用途是发送数据库队列中的Email(这里Email来源于用户注册时需要发送的注册成功的信息等等,通常的做法是在用户注册完毕后马上就发送Email,而CS采用的是将要发送的Email存入数据库,在一定的间隔时间后统一处理这段时间内的所有Email发送,处理的类就是EmailJob.cs)。这里还要注意一点:TimerCallback的实例不在创建计时器的线程中执行,而是在系统提供的一个单独线程池线程中执行。

再来看看CommunityServerComponents项目下的Jobs.cs文件,这个类第一次看设计的有点蹩脚,它的构造函数是静态的,但是在静态的构造函数中实例化它自己,实例化后保存在static readonly的变量里(晕了吧,嘿嘿!)其实这叫单件模式(Singleton模式),确保全局中有且只有一个Jobs实例。Jobs的实例主要完成从CS的配置文件中读取出每个Job的配置信息,先看一下Job的配置信息:

<Jobs minutes = "5" singleThread = "false">

         <job name = "SiteStatisticsUpdates" type = "CommunityServer.Components.SiteStatisticsJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" />

         <job name = "ForumsIndexing" type = "CommunityServer.Discussions.Components.ForumsSearchJob, CommunityServer.Discussions" enabled = "false" enableShutDown = "false" />

         <job name = "WeblogIndexing" type = "CommunityServer.Blogs.Components.WeblogSearchJob, CommunityServer.Blogs" enabled = "false" enableShutDown = "false" />

         <job name = "GalleryIndexing" type = "CommunityServer.Galleries.Components.GallerySearchJob, CommunityServer.Galleries" enabled = "false" enableShutDown = "false" />

         <job name = "AnonymousUsers" minutes = "1" type = "CommunityServer.Components.AnonymousUserJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" />

         <job singleThread = "false" minutes = "5" name = "Emails" type = "CommunityServer.Components.EmailJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" failureInterval = "1" numberOfTries = "10" />

         <job name = "Referrals" type = "CommunityServer.Components.ReferralsJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" />

         <job name = "Views" type = "CommunityServer.Components.ViewsJob, CommunityServer.Components" enabled = "true" enableShutDown = "false" />

         <job name = "RecentBlogContent" type = "CommunityServer.Blogs.Components.RecentContentJob, CommunityServer.Blogs" enabled = "true" enableShutDown = "false" />

         <job name = "RebuildThumbnailsJob" type = "CommunityServer.Galleries.Components.RebuildThumbnailsJob, CommunityServer.Galleries" picturesPerRun = "25" enabled = "true" enableShutDown = "false" />

</Jobs>

解释一下这些xml的节点意思:

<Jobs minutes = "5" singleThread = "false">

minutes:执行回调函数TimerCallback的时间与时间间隔,这里是5分钟,也就是说执行回调函数在初始化请求之后的五分钟开始,并且每五分钟一次。

singleThread:是单线程还是多线程,前面说过为Timer创建的TimerCallback的实例不在创建计时器的线程中执行,而是在系统提供的一个单独线程池线程中执行,如果值为“false”就会为每个Job创建一个Timer线程,如果为“true”就创建一个Timer。

<job>节点比较灵活,一些属性是该节点特有的,这是根据实现IJob接口类的需要决定的,以Email发送的类为例:



[1] [2] [3] 下一页 




上一篇:Community Server专题六:Delegates & Events

下一篇:Community Server专题八:MemberRole之Membership

Community Server专题七: Job & Timer 相关文章:
·SQL server 2005安装问题汇总
·Sql server优化50法
·C#源码读取excel数据到程序中-SQL SERVER-到dataset中
·SQL Server 2005 中的分区表和索引
·SQL Server 练习题
·把Windows Server 2003配置为NAT路由器
·提高查询速度:SQL Server数据库优化方案
·关闭Windows Server 2003关机事件跟踪程序
·SQL SERVER中的union,cube,rollup和cumpute运算符
·部署 Microsoft SQL Server 2005 群集
Community Server专题七: Job & Timer 相关软件:
·SQL Server 2000 基础系列课程视频
·Windows 2003 Server 简体中文企业版(免激活)ISO
·Microsoft SQL Server 2005 Enterprise Edition SP1简体中文企业版
·逐步精通数据库 sql server 视频教程
·简体中文 Windows 2000 Server 培训教程
·MS SQL Server 2000 四合一
·青春期性教育专题片(下)
·IMail Server v7.13 无限制破解版
·Microsoft.SQL.Server.2005.简体中文开发版
·Active Server Pages & Web 数据库(PDG)

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.vipcn.net
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.vipcn.net All Rights Reserved. 鄂ICP备05000083号Powered by:viphot