之前的一個項目中使用System.Threading.Timer對象時有沒有遇到IIS釋放Timer對象的問 題。說實話之前真沒遇到過這個問題,就是說我之前定義的timer對象沒有釋放,運行正常, 回來後我就百度尋找這方面得信息,原來IIS在運行WebApp時對於非靜態資源都是自動釋放, 而我回頭看了看之前寫的Web程序,很幸運當時是這麼寫的:
Global.asax文件
private static Timer time; //System.Threading;
private static Log log;
protected void Application_Start(object sender, EventArgs e)
{
log = new Log();
log.Write(ref time, 5000);
}
Log.cs內代碼:
class Log{
public void Write(ref Timer time,int flashTime)
{
if (time == null) {
time = new Timer(new TimerCallback(DoExecution), this, 0,
flashTime);
}
}
void DoExecution(object obj)
{
//定時執行代碼
}
}
也就是說把timer對象定義成全局靜態對象就不會被IIS所釋放,如果當時不這麼 寫,肯定會在出錯時郁悶好一陣。不過現在知識面廣了,定時執行任務可以使用Quartz.net 開源組件,他封裝了Time對象,可以使任務的執行更穩定,下面給出示例代碼:
public class TimeJob:Quartz.IJob {
public void Execute(Quartz.JobExecutionContext context)
{
//需要定時執行的代碼。。。
}
}
public class Global : System.Web.HttpApplication
{
private static Timer time ;
protected void Application_Start(object sender, EventArgs e)
{
//定義任務
Quartz.JobDetail job = new Quartz.JobDetail("job1", "group1", typeof
(TimeJob));
//定義觸發器
Quartz.Trigger trigger = Quartz.TriggerUtils.MakeSecondlyTrigger(5);//5秒
執行
trigger.Name = "trigger1";
trigger.JobGroup = "group1";
trigger.JobName = "job1";
trigger.Group = "group1";
//定義計劃著
Quartz.ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
Quartz.IScheduler sch = sf.GetScheduler();
sch.AddJob(job, true);//添加任務
sch.ScheduleJob(trigger);//添加計劃者
sch.Start();//開始執行
}
}
以上代碼也是在Global.asax文件中定義的。