C# 定时执行任务

WEB程序启动时开始执行某一定时任务,应用池回收或程序关闭后再次启动定时任务,在原本基础上继续执行(利用序列化,保存其持久性)

定时任务对象序列化存入数据库,需要时再从数据库取出反序列化为一实例对象进行使用。

序列化,反序列化对象实例,byte[]之间的转换方法:

[c-sharp] view plain copy print ?
  1. /// <summary> 
  2. /// 序列化一个类实例对象 
  3. /// </summary> 
  4. /// <param name="obj">类实例对象</param> 
  5. /// <returns>序列化后的byte数组</returns> 
  6. public staticbyte[] ClassSerializer(object obj) 
  7.     //创建一内存流 
  8.     MemoryStream stream = new MemoryStream(); 
  9.      
  10.     //实例化二进制序列类 
  11.     IFormatter bf = new BinaryFormatter(); 
  12.     //将给定类实例对象序列化到指定流 
  13.     bf.Serialize(stream, obj); 
  14.  
  15.     //将流中内容读入到byte[]对象 
  16.     byte[] info = new byte[stream.Length]; 
  17.     stream.Position = 0; 
  18.     stream.Read(info, 0, (int)stream.Length); 
  19.      
  20.     //关闭流 
  21.     stream.Close(); 
  22.  
  23.     //返回序列化后的byte数组 
  24.     return info; 
  25.  
  26. /// <summary> 
  27. /// 反序列化流构建一个新对象 
  28. /// </summary> 
  29. /// <param name="info">序列化后的byte数组</param> 
  30. /// <returns></returns> 
  31. public staticobject ClassDeserialize(Byte[] info) 
  32.     //创建一内存流用指定byte[]初始化 
  33.     MemoryStream stream = new MemoryStream(info); 
  34.  
  35.     //实例化二进制序列类 
  36.     IFormatter bf = new BinaryFormatter(); 
  37.     //反序列化流中数据,生成新的对象 
  38.     Object obj = bf.Deserialize(stream); 
  39.  
  40.     //关闭流 
  41.     stream.Close(); 
  42.  
  43.     //返回反序列化后生成的对象 
  44.     return obj; 

基础定时任务操作类:

[c-sharp] view plain copy print ?
  1. namespace _66_TimerTask 
  2. {    
  3.     //此类可序列化 
  4.     [Serializable] 
  5.     public class TimerInfo 
  6.     { 
  7.         //定义委托类 
  8.         public delegatevoid TimerTaskDelegate(); 
  9.  
  10.         //当前执行程序名称 
  11.         public string name =""
  12.         //几秒后再执行任务 
  13.         public int second; 
  14.         //定义委托实例 
  15.         private TimerTaskDelegate fun; 
  16.  
  17.         //定义一个线程 
  18.         //线程是不可序列化 
  19.         [NonSerialized] 
  20.         private Thread t; 
  21.  
  22.         /// <summary> 
  23.         /// 构造函数 
  24.         /// </summary> 
  25.         /// <param name="name">线程名称</param> 
  26.         /// <param name="second">几秒后再执行任务</param> 
  27.         /// <param name="fun">要执行的任务</param> 
  28.         public TimerInfo(string name,int second, TimerTaskDelegate fun) 
  29.         { 
  30.             this.name = name; 
  31.             this.second = second; 
  32.             this.fun = fun; 
  33.         } 
  34.  
  35.  
  36.         /// <summary> 
  37.         /// 启动定时任务 
  38.         /// </summary> 
  39.         public void Star() 
  40.         { 
  41.             t = new Thread(NewThreadStar); 
  42.             t.Name = this.name; 
  43.              
  44.             t.Start(); 
  45.         } 
  46.  
  47.         /// <summary> 
  48.         /// 线程调用的方法 
  49.         /// </summary> 
  50.         private void NewThreadStar() 
  51.         { 
  52.             //要执行的目标方法 
  53.             fun(); 
  54.  
  55.             //当前线程挂起指定时间 
  56.             Thread.Sleep(second*1000); 
  57.  
  58.             //递归调用实现循环 
  59.             NewThreadStar(); 
  60.         } 
  61.  
  62.         /// <summary> 
  63.         /// 终止定时任务 
  64.         /// </summary> 
  65.         public void Abort() 
  66.         { 
  67.             if (t != null
  68.             { 
  69.                 t.Abort(); 
  70.             } 
  71.         } 
  72.     } 
  73.      

定时任务调用的方法:

[c-sharp] view plain copy print ?
  1. namespace _66_TimerTask.DelegateFunction 
  2.     [Serializable] 
  3.     public class DelegateFun 
  4.     { 
  5.         /// <summary> 
  6.         /// 测试用方法 
  7.         /// </summary> 
  8.         public staticvoid Test1() 
  9.         { 
  10.             SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=GlobeChineseClubV1.1;UID=sa;PWD="); 
  11.             con.Open(); 
  12.  
  13.             SqlCommand cmd = new SqlCommand("insert into TimerTest (time) values ('" + DateTime.Now +"')", con); 
  14.             cmd.ExecuteNonQuery(); 
  15.  
  16.             con.Close(); 
  17.         } 
  18.  
  19.         public staticvoid Test2() 
  20.         { 
  21.             SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=GlobeChineseClubV1.1;UID=sa;PWD="); 
  22.             con.Open(); 
  23.  
  24.             SqlCommand cmd = new SqlCommand("insert into TimerTest2 (time) values ('" + DateTime.Now +"')", con); 
  25.             cmd.ExecuteNonQuery(); 
  26.  
  27.             con.Close(); 
  28.         } 
  29.     } 

测试(Global.asax):

[c-sharp] view plain copy print ?
  1. TimerInfo t1; 
  2.  
  3. void Application_Start(object sender, EventArgs e)  
  4.     //在应用程序启动时运行的代码 
  5.     CreateTimer(); 
  6.  
  7. //创建定时任务 
  8. private void CreateTimer() 
  9.     #region 检查数据库中是否存储有序列化后的相关类实例对象 
  10.     //如存在,查询数据库指定字段,反序列化为指定实例对象:t1 = (TimerInfo)SerializationHelper.ClassDeserialize((byte[])sdr["info"]); 
  11.     //不存在,创建新的TimerInfo实例对象:t1 = new _66_TimerTask.TimerInfo(unCreateTimersName [i], 10, _66_TimerTask.DelegateFunction.DelegateFun.Test1); 
  12.     #endregion 
  13.  
  14.     //启动定时任务 
  15.     t1.Star(); 
  16.  
  17. void Application_End(object sender, EventArgs e)  
  18.     //在应用程序关闭时运行的代码 
  19.      //序列化指定实例对象,返回其BYTE[] 
  20.     byte[] info1 = SerializationHelper.ClassSerializer(t1); 
  21.     SqlConnection con = new SqlConnection(connectionStr); 
  22.     con.Open(); 
  23.  
  24.     //序列化对象后的BYTE[]写入数据库info字段(image类型) 
  25.     SqlCommand cmd = new SqlCommand("delete TimerInfoTest;insert into TimerInfoTest (className,info) values ('" + t1.name +"', @info)", con); 
  26.     cmd.Parameters.Add("@info", System.Data.SqlDbType.Binary); 
  27.     cmd.Parameters["@info"].Value = info1; 
  28.  
  29.     cmd.ExecuteNonQuery(); 
  30.  
  31.     con.Close(); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值