之前的一个项目中使用System.Threading.Timer对象时有没有遇到IIS释放Timer对象的问题。说实话之前真没遇到过这个问题,就是说我之前定义的timer对象没有释放,运行正常,回来后我就百度寻找这方面得信息,原来IIS在运行WebApp时对于非静态资源都是自动释放,而我回头看了看之前写的Web程序,很幸运当时是这么写的:

Global.asax文件

1
2
3
4
5
6
7
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内代码:

1
2
3
4
5
6
7
8
9
10
11
12
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对象,可以使任务的执行更稳定,下面给出示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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文件中定义的。


最后一贯的作风:欢迎各位大牛拍砖~~~