C#+TaskScheduler(定时任务)实现定时自动下载

转载地址:https://blog.csdn.net/kongwei521/article/details/53185788

实现原理,客户是广电,在广电服务器创建一个FTP目录,然后每天自动从卫星上自动更新节目列表, 然后功能就是要每天定点一个时间自动跟FTP目录中前一天下载下来的节目信息进行时间和大小对比,如果有差异则自动下载覆盖,让插入到数据库中,因此就想到了两个办法:

1:用服务来实现 http://blog.csdn.net/kongwei521/article/details/51626589  http://blog.csdn.net/kongwei521/article/details/51793036

2:windows定时任务

经过一段时间观察用服务来实现的 下载时间会越来越靠后,感觉不靠谱就想用定时任务来替换。

最终使用 Microsoft.Win32.TaskScheduler 来实现了可以使用,另外两个 FluentScheduler Quartz.Net  来实现,

效果图:

代码:

新建一个控制台应用程序:

然后写代码:

using Microsoft.Win32.TaskScheduler;

第一种方法:

 
  1. // Get the service on the local machine

  2. TaskService ts = new TaskService();

  3.  
  4. // Create a new task definition and assign properties

  5. TaskDefinition td = ts.NewTask();

  6. td.RegistrationInfo.Description = "wei kong";

  7.  
  8. // Add a trigger that will fire the task at this time every other day

  9. DailyTrigger dt = (DailyTrigger)td.Triggers.Add(new DailyTrigger { DaysInterval = 1 });

  10. //设置任务起始时间

  11. dt.StartBoundary = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 09:40:00"));

  12. //设置重复任务间隔时间

  13. dt.Repetition.Interval = TimeSpan.FromDays(1);

  14. // Create an action that will launch Notepad whenever the trigger fires

  15. td.Actions.Add(new ExecAction(@"C:\AutoDownTvInfo.exe", "", null));//这里可参考http://blog.csdn.net/kongwei521/article/details/51793036下载

  16.  
  17. // Register the task in the root folder

  18. ts.RootFolder.RegisterTaskDefinition(@"Test", td);

  19.  
  20. Thread.Sleep(2000);

  21. Console.WriteLine("计划任务结束" + DateTime.Now);

  22. Thread.Sleep(2000);


第二种方法:

使用方法:

  var compath = AppDomain.CurrentDomain.BaseDirectory +"AutoDownTvInfo.exe";//这里可参考http://blog.csdn.net/kongwei521/article/details/51793036下载

            CreateTaskScheduler("kong wei", "AutoDownTvInfo", compath, "500");

 
  1. /// delete task

  2. /// </summary>

  3. /// <param name="taskName"></param>

  4. private static void DeleteTask(string taskName)

  5. {

  6. TaskSchedulerClass ts = new TaskSchedulerClass();

  7. ts.Connect(null, null, null, null);

  8. ITaskFolder folder = ts.GetFolder("\\");

  9. folder.DeleteTask(taskName, 0);

  10. }

  11.  
  12. /// <summary>

  13. /// get all tasks

  14. /// </summary>

  15. public static IRegisteredTaskCollection GetAllTasks()

  16. {

  17. TaskSchedulerClass ts = new TaskSchedulerClass();

  18. ts.Connect(null, null, null, null);

  19. ITaskFolder folder = ts.GetFolder("\\");

  20. IRegisteredTaskCollection tasks_exists = folder.GetTasks(1);

  21. return tasks_exists;

  22. }

  23. /// <summary>

  24. /// check task isexists

  25. /// </summary>

  26. /// <param name="taskName"></param>

  27. /// <returns></returns>

  28. public static bool IsExists(string taskName)

  29. {

  30. var isExists = false;

  31. IRegisteredTaskCollection tasks_exists = GetAllTasks();

  32. for (int i = 1; i <= tasks_exists.Count; i++)

  33. {

  34. IRegisteredTask t = tasks_exists[i];

  35. if (t.Name.Equals(taskName))

  36. {

  37. isExists = true;

  38. break;

  39. }

  40. }

  41. return isExists;

  42. }

  43.  
  44. /// <summary>

  45. /// create task

  46. /// </summary>

  47. /// <param name="creator"></param>

  48. /// <param name="taskName"></param>

  49. /// <param name="path"></param>

  50. /// <param name="interval"></param>

  51. /// <returns>state</returns>

  52. public static _TASK_STATE CreateTaskScheduler(string creator, string taskName, string path, string interval)

  53. {

  54. try

  55. {

  56. if (IsExists(taskName))

  57. {

  58. DeleteTask(taskName);

  59. }

  60.  
  61. //new scheduler

  62. TaskSchedulerClass scheduler = new TaskSchedulerClass();

  63. //pc-name/ip,username,domain,password

  64. scheduler.Connect(null, null, null, null);

  65. //get scheduler folder

  66. ITaskFolder folder = scheduler.GetFolder("\\");

  67.  
  68.  
  69. //set base attr

  70. ITaskDefinition task = scheduler.NewTask(0);

  71. task.RegistrationInfo.Author = "kong wei";//creator

  72. task.RegistrationInfo.Description = "每天自动定时下载节目信息";//description

  73.  
  74. //set trigger (IDailyTrigger ITimeTrigger) 设置小时/分/秒来实现

  75. // ITimeTrigger tt = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);

  76. // tt.Repetition.Interval = interval;// format PT1H1M==1小时1分钟 设置的值最终都会转成分钟加入到触发器

  77. //设置每天特定的时间来实现 IDailyTrigger tt = (IDailyTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_DAILY);

  78. tt.StartBoundary = "2016-11-15T10:15:00";

  79. //start time //set action

  80.  IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);

  81. action.Path = path; task.Settings.ExecutionTimeLimit = "PT0S"; //运行任务时间超时停止任务吗? PTOS 不开启超时

  82. task.Settings.DisallowStartIfOnBatteries = false;//只有在交流电源下才执行

  83. task.Settings.RunOnlyIfIdle = false;//仅当计算机空闲下才执行

  84. IRegisteredTask regTask = folder.RegisterTaskDefinition(taskName, task, (int)_TASK_CREATION.TASK_CREATE, null, //user null,

  85. // password _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, ""); IRunningTask runTask = regTask.Run(null); return runTask.State;

  86. }

  87.  catch (Exception ex) { throw ex; } }

 

参考资料:

http://twinklers3.rssing.com/chan-3472162/all_p18.html

http://tzedeck.seesaa.net/article/388838290.html

http://ymlib.com/YMWorld/CS/P1/W3/P134/YMWCS134.html

猜你喜欢

转载自blog.csdn.net/mao_mao37/article/details/82592545