using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32.TaskScheduler; using System.IO; namespace ServiceHelper { /// /// 计划任务处理类 /// public static class TaskControl { //触发时间 private static short _daysInterval; //触发间隔 private static string _startBoundary; private const string STOP = "sc stop Aca.Certain.MiddleService"; private const string START = "sc start Aca.Certain.MiddleService"; /// /// 设置计划任务 /// /// 触发间隔 /// 触发时间 public static bool SetTask(short daysInterval, string startBoundary) { _daysInterval = daysInterval; _startBoundary = startBoundary; TaskService taskService = new TaskService(); Task t = taskService.GetTask(@"Aca.Certain.MiddleServiceRestart"); if (t == null) { return CreateTask(taskService); } else { return ChangeTask(taskService); } } /// /// 创建计划任务 /// /// private static bool CreateTask(TaskService taskService) { if (CreatBat()) { // 创建一个计划任务 TaskDefinition taskDefinition = taskService.NewTask(); //描述 taskDefinition.RegistrationInfo.Description = "Aca.Certain.MiddleServiceRestart服务重启计划"; //创建者 taskDefinition.RegistrationInfo.Author = "CERTAIN"; //设置最高权限 taskDefinition.Principal.RunLevel = TaskRunLevel.Highest; //设置并行运行新实例 taskDefinition.Settings.MultipleInstances = TaskInstancesPolicy.Parallel; //每天启动 Trigger dailyTrigger = new DailyTrigger { DaysInterval = _daysInterval }; //限制计划任务每次执行时间不能超过1小时 dailyTrigger.ExecutionTimeLimit = TimeSpan.FromHours(1); //启动时间 dailyTrigger.StartBoundary = DateTime.Parse(_startBoundary); //全天重复执行 //dt.Repetition.Duration = TimeSpan.FromHours(24); //每隔30分钟重复一次 //dt.Repetition.Interval = TimeSpan.FromMinutes(30); //将触发器添加到计划任务td的触发器中 taskDefinition.Triggers.Add(dailyTrigger); //创建一个执行操作 var bat = new ExecAction(System.Environment.CurrentDirectory + "\\restart.bat", "", null); //添加执行操作到计划任务的操作中 taskDefinition.Actions.Add(bat); //注册计划任务 taskService.RootFolder.RegisterTaskDefinition(@"Aca.Certain.MiddleServiceRestart", taskDefinition); return true; } else { return false; } } /// /// 修改计划任务 /// /// private static bool ChangeTask(TaskService taskService) { DeleteTestTask(); return CreateTask(taskService); } /// /// 删除计划任务 /// public static void DeleteTestTask() { TaskService ts = new TaskService(); Task t = ts.GetTask(@"Aca.Certain.MiddleServiceRestart"); if (t != null) { // 计划任务服务 ts.RootFolder.DeleteTask("Aca.Certain.MiddleServiceRestart"); } } /// /// 查询计划任务 /// private static Dictionary RetrieveTestTask() { Dictionary dt=new Dictionary(); // 计划任务服务 TaskService ts = new TaskService(); Task t = ts.GetTask(@"DicomeServiceRestart"); if (null != t) { Console.WriteLine("Task Name={0}", t.Name); Console.WriteLine("Task Execution Time={0}", t.LastRunTime); Console.WriteLine("Task Last Run Result={0}", t.LastTaskResult); Console.WriteLine("Task Next Execution Time={0}", t.NextRunTime); return dt; } else { return null; } } /// /// 创建重启服务bat文件 /// /// 创建成功返回true,失败返回false private static bool CreatBat() { FileStream fs = null; StreamReader sr = null; StreamWriter sw = null; try { fs = new FileStream(System.Environment.CurrentDirectory + "\\restart.bat", FileMode.OpenOrCreate); try { sr = new StreamReader(fs); string stop = sr.ReadLine(); if (STOP.Equals(stop)) { string start = sr.ReadLine(); if (START.Equals(start)) { if (string.IsNullOrEmpty(sr.ReadLine())) { //文件已存在并且数据正确,返回true return true; } } } fs.SetLength(0); } catch (Exception) { fs.SetLength(0); try { sr.Close(); } catch { } //文件流打开失败,返回false return false; throw; } try { sw = new StreamWriter(fs); sw.WriteLine(STOP); sw.WriteLine(START); } catch (Exception) { //文件流打开失败,返回false return false; throw; } finally { try { sw.Close(); } catch { } try { sr.Close(); } catch { } } } catch (Exception) { //文件流打开失败,返回false return false; throw; } finally { try { fs.Close(); } catch { } } return true; } } }