码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2015-04-09 19:09:41      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:

需求:在不定时间段运行多个后台程序(winfrom,wpf,console,等等)用于更新数据。

 

问题:为什么要使用计划任务,而不直接在程序中使用一个计时器来出发呢?

答:最明显的一点,使用计时器程序一直在后台运行着,但需求中只需要一天运行一次,或一个月运行一次。一直后台跑着计时这不白浪费CPU资源么。

 

解决方案:

1.使用windows自带的计划任务 在控制面板中可以看到,手动新建计划任务。

2.使用微软自带的类库TaskScheduler("c:\windows\system32\taskachd.dll")来创建 

3.使用Process.Star() dos命令来创建计划任务

 

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

 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.DeleteTask(taskName, 0);
        }

        /// <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;
        }
        /// <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;
        }

        /// <summary>
        /// create task
        /// </summary>
        /// <param name="creator"></param>
        /// <param name="taskName"></param>
        /// <param name="path"></param>
        /// <param name="interval"></param>
        /// <returns>state</returns>
         public static _TASK_STATE CreateTaskScheduler(string creator, string taskName, string path,string interval)
        {
            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 = "McodsAdmin";//creator
                task.RegistrationInfo.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 = "2015-04-09T14:27:25";//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;
            }

        }
    }

 

注意

1.引用taskachd.dll后选中按下F4在属性中将 嵌入互操作类型 改为 False (没设置会报一个错误: 无法嵌入互操作类型“TaskScheduler.TaskSchedulerClass”。请改用适用的接口。 )

2.schdule.Connec("pc-name 或者 ip","username","domain","password")

3.触发器类型有多种选择(按天IDailyTrigger,按分钟ITimeTrigger));

触发频率(Interval)的格式需要遵循"PT1H1M"这样的格式;

起始时间需要遵循"YYYY-MM-DDThh:mm:ss"这样的格式。

 

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

 

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

标签:

原文地址:http://www.cnblogs.com/tonge/p/4410066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!