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

需求:在不定时间段运行多个后台程序(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

时间: 2024-11-06 15:25:11

使用C#创建计划任务(How to create a Task Scheduler use C# )的相关文章

自动创建计划任务之删除7天以前的备份文件批处理

本文的产生是在写个人网站备份脚本的时候看到的,留下来作为参考 问题场景:由于我的公司服务器太多,之前建立的每日备份日志文件日积月累会很大. 而且不需要保留那么多,按公司要求只需要保留一个星期的即可. 1.那么有什么方法自动删除7天以前备份的*.log文件呢? 2.服务器过多,不可能一一手动创建,有没有自动完成这个创建计划任务的批处理呢? 首先要解决的是自动删除7天以前备份的log文件,然后创建一个可以自动创建一个每 周指定日期指定时间运行一次该自动删除的批处理 一:删除7天以前备份的文件 命令

在Spring3中使用注解(@Scheduled)创建计划任务

Spring3中加强了注解的使用,其中计划任务也得到了增强,现在创建一个计划任务只需要两步就完成了: 创建一个Java类,添加一个无参无返回值的方法,在方法上用@Scheduled注解修饰一下: 在Spring配置文件中添加三个<task:**** />节点: 最后说明一下,第一步创建的Java类要成为Spring可管理的Bean,可以直接写在XML里,也可以@Component一下 计划任务类: /** * com.zywang.spring.task.SpringTaskDemo.java

创建一个Eclipse项目【Create a Project with Eclipse】

最近一个问题很困扰我,今天则得到了答案,也意味着我该选择了. 不知道大家有没有遇到过这样的情况,我是上年刚毕业,大四时进行过java培训,12年9月-13年4月,在这之前已经自学过java.7月份时进入一家公司工作,今年3月份辞职,4月份找到工作,来上班了.一开始就不太喜欢公司氛围,前台,hr,态度什么的都不太好,工作环境也极像客服部,整天电话不断,讨论声不断,第一个星期真是煎熬,去了两三天之后有辞职的想法,但是后面想想还是算了,公司待遇还可以. 但是进入到公司后leader让学PHP,学PHP

oracle创建用户ORA-01045:user lacks CREATE SESSION privilege 及一些简单操作(one lesson)

scott用户成功连接数据库的具体方法: 1.grant connect, resource to scott;2.grant create session to scott; 3.cmd4.sqlplus scott/tiger Oracle的安全 1.用户管理 用户至少需要会话的权利,否则连接也不成功: 用户在会话的权利上,应该有其他操作的权利: Oracle的用户和口令不区分大小写,真是让人大跌眼镜: Oralce中,所有用户必须明确被授权,才可以操作: SQL Server中,创建的用户

PHP MySQL 创建数据库和表 之 Create

创建数据库 CREATE DATABASE 语句用于在 MySQL 中创建数据库. 语法 CREATE DATABASE database_name 为了让 PHP 执行上面的语句,我们必须使用 mysql_query() 函数.此函数用于向 MySQL 连接发送查询或命令. 例子 在下面的例子中,我们创建了一个名为 "my_db" 的数据库: <?php $con = mysql_connect("localhost","peter",&

linux crontab创建计划任务

1.编辑计划任务 编辑crontab文件 crontab -e 2.查看计划任务日志 查看crontab日志 tail -100f /var/log/cron 3.创建计划任务格式 (1)基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示月份1-12 第5列标识号星期0-6(0表示星期天) 第6列要运行的命令 (2)crontab文件的一些例子:

Win7系统如何创建计划任务的小技巧(图文)

题描述:Win7系统如何创建计划任务,Win7的计划任务可以执行自动关机么?任务计划,可以将任何脚本.程序或文档安排在某个时间运行.“任务计划”在每次启动windows系统的时候自动启动(默认Task Scheduler服务是开启的)并在后台运行.使用“任务计划”可以完成以下任务: 计划让任务在每天.每星期.每月或某些时刻(例如系统启动时)运行.更改任务的计划.停止计划的任务.自定义某个任务在某个时刻的运行方式. 任务计划主界面介绍: 1,点击“开始→控制面板→系统和安全→管理工具→任务计划”.

linux如何创建计划任务

做运维怎么能不懂创建计划任务! 1.at:用来创建临时任务,任务完成后命令不再生效 最常见的就是服务器的关机或重启了 [[email protected] 桌面]# at 19:00 at> /sbin/shutdown -h now<EOT>  这里最好输入命令的绝对路径 如果不知道命令的绝对路径可以通过which+空格+命令查看 job 4 at 2017-02-27 19:00 ps:红色字体为输入命令绝对路径后Ctrl+D后自动生成 查看命令可以用atq或者at -l [[ema

创建计划任务

前言 计划任务,是系统自动完成任务的一种方式.其原理就像是闹钟一样,到了我们指定的某一个时间点,系统就会自动的执行某种操作,实现我们想要达到的目的.在实际生产中有很多这样类似的例子,例如,定时发送邮件,定时备份某个目录,定时检查计算机的磁盘利用率并及时提醒管理员. Linux 操作系统提供了这样的计划任务机制,使我们能够灵活的制定计划任务,以达到我们实际生产中的目的. 目录 我们将从以下几个方面系统地介绍Linux中地计划任务. 一次性计划任务–at命令 周期性计划任务–cron命令 anacr