日期:2010-07-12 浏览次数:20383 次
在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指: