使用C#创建计划任务(How to create a Task Scheduler use C# )

王朝学院·作者佚名  2016-05-20  
宽屏版  字体: |||超大  

使用C#创建计划任务(How to create a Task Scheduler use C# )本文主要讲解了如何使用C#来创建windows计划任务。

需求:在不定时间段运行多个后台程序(winfrom,wpf,console,等等)用于更新数据。问题:为什么要使用计划任务,而不直接在程序中使用一个计时器来出发呢?

答:最明显的一点,使用计时器程序一直在后台运行着,但需求中只需要一天运行一次,或一个月运行一次。一直后台跑着计时这不白浪费CPU资源么。解决方案:使用windows自带的计划任务 在控制面板中可以看到,手动新建计划任务。使用微软自带的类库TaskScheduler("c:\windows\system32\taskchd.dll")来创建使用PRocess.Star() dos命令来创建计划任务dos命令运行scheduler.exe 最简单实例:

schtasks /create /sc minute /mo 1 /tn MyTask /tr calc.exe /st 09:00 //从9点开始每隔一分钟运行一次记事本

具体帮助文档可在cmd命令框输入:

>schtasks /?

>schtasks /create /?

>schtasks /delete /?

>schtasks /query /?

>schtasks /change /?

还可参照:https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357%28v=vs.85%29.aspx

解决方案开始:

這里选用微软自带的类库TaskScheduler,下面是封装过的代码,包含了删除计划任务、判断计划任务是否存在、获取所有的计划任务、创建计划任务 。(具体看详细注释):

获取计划任务的列表:

/// <summary> /// get all tasks /// </summary> public static IRegisteredTaskCollection GetAllTasks() { TaskSchedulerClass ts = new TaskSchedulerClass(); ts.Connect(null, null, null, null); ITaskFolder folder = ts.GetFolder("\\"); IRegisteredTaskCollection tasks_exists = folder.GetTasks(1); return tasks_exists; }

View Code

判断计划任务是否存在:

/// <summary> /// check task isexists /// </summary> /// <param name="taskName"></param> /// <returns></returns> public static bool IsExists(string taskName) { var isExists = false; IRegisteredTaskCollection tasks_exists = GetAllTasks(); for (int i = 1; i <= tasks_exists.Count; i++) { IRegisteredTask t = tasks_exists[i]; if (t.Name.Equals(taskName)) { isExists=true; break; } } return isExists; }

View Code

删除计划任务:

/// <summary> /// delete task /// </summary> /// <param name="taskName"></param> private static void DeleteTask(string taskName) { TaskSchedulerClass ts = new TaskSchedulerClass(); ts.Connect(null, null, null, null); ITaskFolder folder = ts.GetFolder("\\"); folder.DeleteTask(taskName, 0); }

View Code

创建计划任务:

/// <summary> /// create scheduler /// </summary> /// <param name="creator"></param> /// <param name="taskName"></param> /// <param name="path"></param> /// <param name="interval"></param> /// <param name="startBoundary"></param> /// <param name="description"></param> /// <returns></returns> public static _TASK_STATE CreateTaskScheduler(string creator, string taskName, string path,string interval,string startBoundary,string description) { try { if (IsExists(taskName)) { DeleteTask(taskName); } //new scheduler TaskSchedulerClass scheduler = new TaskSchedulerClass(); //pc-name/ip,username,domain,passWord scheduler.Connect(null, null, null, null); //get scheduler folder ITaskFolder folder = scheduler.GetFolder("\\"); //set base attr ITaskDefinition task = scheduler.NewTask(0); task.RegistrationInfo.Author = creator;//creator task.RegistrationInfo.Description = description;//description //set trigger (IDailyTrigger ITimeTrigger) ITimeTrigger tt = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME); tt.Repetition.Interval = interval;// format PT1H1M==1小时1分钟 设置的值最终都会转成分钟加入到触发器 tt.StartBoundary = startBoundary;//start time //set action IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC); action.Path = path;//计划任务调用的程序路径 task.Settings.ExecutionTimeLimit = "PT0S"; //运行任务时间超时停止任务吗? PTOS 不开启超时 task.Settings.DisallowStartIfOnBatteries = false;//只有在交流电源下才执行 task.Settings.RunOnlyIfIdle = false;//仅当计算机空闲下才执行 IRegisteredTask regTask = folder.RegisterTaskDefinition(taskName, task, (int)_TASK_CREATION.TASK_CREATE, null, //user null, // password _TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN, ""); IRunningTask runTask = regTask.Run(null); return runTask.State ; } catch (Exception ex) { throw ex; } }

View Code

完整代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using TaskScheduler;namespace McodsBgManager{ public class SchTaskExt { /// <summary> /// delete task /// </summary> /// <param name="taskName"></param> private static void DeleteTask(string taskName) { TaskSchedulerClass ts = new TaskSchedulerClass(); ts.Connect(null, null, null, null); ITaskFolder folder = ts.GetFolder("\\"); folder.D

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有