六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1086|回复: 0

C# 定时执行任务 .

[复制链接]
 楼主| 发表于 2012-10-16 13:33:58 | 显示全部楼层 |阅读模式
WEB程序启动时开始执行某一定时任务,应用池回收或程序关闭后再次启动定时任务,在原本基础上继续执行(利用序列化,保存其持久性)

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

序列化,反序列化对象实例,byte[]之间的转换方法:
  1. /// <summary>
  2. /// 序列化一个类实例对象
  3. /// </summary>
  4. /// <param name="obj">类实例对象</param>
  5. /// <returns>序列化后的byte数组</returns>
  6. public static byte[] ClassSerializer(object obj)
  7. {
  8. //创建一内存流
  9. MemoryStream stream = new MemoryStream();

  10. //实例化二进制序列类
  11. IFormatter bf = new BinaryFormatter();
  12. //将给定类实例对象序列化到指定流
  13. bf.Serialize(stream, obj);

  14. //将流中内容读入到byte[]对象
  15. byte[] info = new byte[stream.Length];
  16. stream.Position = 0;
  17. stream.Read(info, 0, (int)stream.Length);

  18. //关闭流
  19. stream.Close();

  20. //返回序列化后的byte数组
  21. return info;
  22. }

  23. /// <summary>
  24. /// 反序列化流构建一个新对象
  25. /// </summary>
  26. /// <param name="info">序列化后的byte数组</param>
  27. /// <returns></returns>
  28. public static object ClassDeserialize(Byte[] info)
  29. {
  30. //创建一内存流用指定byte[]初始化
  31. MemoryStream stream = new MemoryStream(info);

  32. //实例化二进制序列类
  33. IFormatter bf = new BinaryFormatter();
  34. //反序列化流中数据,生成新的对象
  35. Object obj = bf.Deserialize(stream);

  36. //关闭流
  37. stream.Close();

  38. //返回反序列化后生成的对象
  39. return obj;
  40. }
复制代码
基础定时任务操作类:
  1. namespace _66_TimerTask
  2. {
  3. //此类可序列化
  4. [Serializable]
  5. public class TimerInfo
  6. {
  7. //定义委托类
  8. public delegate void TimerTaskDelegate();

  9. //当前执行程序名称
  10. public string name = "";
  11. //几秒后再执行任务
  12. public int second;
  13. //定义委托实例
  14. private TimerTaskDelegate fun;

  15. //定义一个线程
  16. //线程是不可序列化
  17. [NonSerialized]
  18. private Thread t;

  19. /// <summary>
  20. /// 构造函数
  21. /// </summary>
  22. /// <param name="name">线程名称</param>
  23. /// <param name="second">几秒后再执行任务</param>
  24. /// <param name="fun">要执行的任务</param>
  25. public TimerInfo(string name, int second, TimerTaskDelegate fun)
  26. {
  27. this.name = name;
  28. this.second = second;
  29. this.fun = fun;
  30. }


  31. /// <summary>
  32. /// 启动定时任务
  33. /// </summary>
  34. public void Star()
  35. {
  36. t = new Thread(NewThreadStar);
  37. t.Name = this.name;

  38. t.Start();
  39. }

  40. /// <summary>
  41. /// 线程调用的方法
  42. /// </summary>
  43. private void NewThreadStar()
  44. {
  45. //要执行的目标方法
  46. fun();

  47. //当前线程挂起指定时间
  48. Thread.Sleep(second*1000);

  49. //递归调用实现循环
  50. NewThreadStar();
  51. }

  52. /// <summary>
  53. /// 终止定时任务
  54. /// </summary>
  55. public void Abort()
  56. {
  57. if (t != null)
  58. {
  59. t.Abort();
  60. }
  61. }
  62. }

  63. }
复制代码
定时任务调用的方法:
  1. namespace _66_TimerTask.DelegateFunction
  2. {
  3. [Serializable]
  4. public class DelegateFun
  5. {
  6. /// <summary>
  7. /// 测试用方法
  8. /// </summary>
  9. public static void Test1()
  10. {
  11. SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=GlobeChineseClubV1.1;UID=sa;PWD=");
  12. con.Open();

  13. SqlCommand cmd = new SqlCommand("insert into TimerTest (time) values ('" + DateTime.Now + "')", con);
  14. cmd.ExecuteNonQuery();

  15. con.Close();
  16. }

  17. public static void Test2()
  18. {
  19. SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=GlobeChineseClubV1.1;UID=sa;PWD=");
  20. con.Open();

  21. SqlCommand cmd = new SqlCommand("insert into TimerTest2 (time) values ('" + DateTime.Now + "')", con);
  22. cmd.ExecuteNonQuery();

  23. con.Close();
  24. }
  25. }
  26. }
复制代码
测试(Global.asax):
  1. TimerInfo t1;

  2. void Application_Start(object sender, EventArgs e)
  3. {
  4. //在应用程序启动时运行的代码
  5. CreateTimer();
  6. }

  7. //创建定时任务
  8. private void CreateTimer()
  9. {
  10. #region 检查数据库中是否存储有序列化后的相关类实例对象
  11. //如存在,查询数据库指定字段,反序列化为指定实例对象:t1 = (TimerInfo)SerializationHelper.ClassDeserialize((byte[])sdr["info"]);
  12. //不存在,创建新的TimerInfo实例对象:t1 = new _66_TimerTask.TimerInfo(unCreateTimersName [i], 10, _66_TimerTask.DelegateFunction.DelegateFun.Test1);
  13. #endregion

  14. //启动定时任务
  15. t1.Star();
  16. }

  17. void Application_End(object sender, EventArgs e)
  18. {
  19. //在应用程序关闭时运行的代码
  20. //序列化指定实例对象,返回其BYTE[]
  21. byte[] info1 = SerializationHelper.ClassSerializer(t1);
  22. SqlConnection con = new SqlConnection(connectionStr);
  23. con.Open();

  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. cmd.ExecuteNonQuery();

  29. con.Close();
  30. }
复制代码
该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表