首页 > 学院 > 开发设计 > 正文

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

2019-11-17 02:27:25
字体:
来源:转载
供稿:网友

使用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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表