【问题标题】:Editing Task Scheduler Tasks C#编辑任务计划程序任务 C#
【发布时间】:2017-01-05 07:01:17
【问题描述】:

我正在使用任务计划程序托管包装器从外部程序 (SharePoint) 创建计划任务创建和读取任务很好,但是一旦注册任务我就找不到编辑任务的方法,我必须重新-注册新任务或以某种方式执行更新请求?

注册我的任务:

TaskDefinition newTask = taskService.NewTask();
newTask.RegistrationInfo.Description = (string)timerJobItem.FieldValues["Description"];
newTask.Principal.LogonType = TaskLogonType.InteractiveToken;

// Switch for different schedule options, use createTriggers method
List<Trigger> triggers = createTriggers((string)timerJobItem["Schedule"], (DateTime)timerJobItem["StartTime"]);
newTask.Triggers.Add(triggers.First());

// Create Action to add to new Task
newTask.Actions.Add(new ExecAction((string)timerJobItem["Action"], (string)timerJobItem["Arguments"], null));
// Create Task
taskService.RootFolder.RegisterTaskDefinition(jobName, newTask);

然后我在调度程序中找到了有效的任务,但是当我尝试进行更改时没有任何反应:

// Method to get all Tasks that match a name - Working
private Task[] GetAllTasks(string regexString)
    {
        Regex regex = new Regex(String.Format(@"{0}", regexString));
        using (TaskService taskService = new TaskService())
        {
            Task[] allTasksCollection = taskService.FindAllTasks(regex, true);
            foreach (Task task in allTasksCollection)
            {
                Console.WriteLine(task.Name);
            }
            return allTasksCollection;
        };
    }

....

// Get a single timer job
Task[] allTimerJobs = GetAllTasks(prefix);
List<Task> allTimerJobsList = allTimerJobs.Cast<Task>().ToList();
string jobName = String.Format("{0}[{1}].{2}", prefix, (int)timerJobItem["ID"], jobReference);

// Get Task by name
int indexOfJob = allTimerJobsList.FindIndex(t => t.Name == jobName);
Task matchingJob = allTimerJobsList[indexOfJob];

// No Error but nothing happens to task
matchingJob.Definition.Triggers.Clear();

// No Error but nothing happens to task
matchingJob.Definition.Settings.Enabled = false;

TIA

【问题讨论】:

    标签: c# scheduled-tasks


    【解决方案1】:

    我发现编辑任务的唯一方法是将定义复制到新任务并再次将其注册到根文件夹中。

    以下示例,将描述更改为新值,任务名称必须匹配,否则将创建新任务:

    TaskDefinition td = taskService.NewTask();
    td = existingJob.Definition;
    td.RegistrationInfo.Description = "New Value";
    taskService.RootFolder.RegisterTaskDefinition(jobName, td);
    

    【讨论】:

      【解决方案2】:

      要修改GetAllTask​​s方法找到的结果,你应该在函数外声明using语句并将其作为参数发送。

      private Task[] GetAllTasks(TaskService taskService, string regexString)
      {
          Regex regex = new Regex(String.Format(@"{0}", regexString));
      
          Task[] allTasksCollection = taskService.FindAllTasks(regex, true);
              foreach (Task task in allTasksCollection)
              {
                  Console.WriteLine(task.Name);
              }
              return allTasksCollection;
      
      }
      

      要使用该方法,请在修改方法中声明 using 语句

      // Get a single timer job
      using (TaskService taskService = new TaskService())
      {
          Task[] allTimerJobs = GetAllTasks(taskService, prefix);
          List<Task> allTimerJobsList = allTimerJobs.Cast<Task>().ToList();
          string jobName = String.Format("{0}[{1}].{2}", prefix, (int)timerJobItem["ID"],jobReference);
          // Get Task by name
          int indexOfJob = allTimerJobsList.FindIndex(t => t.Name == jobName);
          Task matchingJob = allTimerJobsList[indexOfJob];
          // No Error but nothing happens to task
          matchingJob.Definition.Triggers.Clear();
          // No Error but nothing happens to task
          matchingJob.Definition.Settings.Enabled = false;
      }
      

      【讨论】:

        【解决方案3】:

        我知道这是 3 年前的事了,但你试过吗:

        td.RegisterChanges();
        

        【讨论】:

        • 哈哈,不知道这是过去的爆炸,甚至不记得我在做什么
        猜你喜欢
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 2011-07-23
        • 2011-10-05
        • 2020-07-25
        相关资源
        最近更新 更多