0

我正在编写一个类,它利用USING语句连接到服务器上的任务调度程序并“做事”;比如启用/禁用任务、启动和停止等。我想改进代码重用,也许通过使用委托,但我不知道如何去做。这是我当前的一些代码:

private static void StopRunningTask(string taskName, string hostName)
{
   Regex regex = GetRegexForFindTask(taskName);
   using (TaskService ts = new TaskService(hostName))
   {
      foreach (Task t in ts.FindAllTasks(regex, true))
      {
         if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase) && t.State == TaskState.Running)
           t.Stop();
      }
   }

private static void RunTask(string taskName, string hostName)
{
   Regex regex = GetRegexForFindTask(taskName);
   using (TaskService ts = new TaskService(hostName))
   {
      foreach (Task t in ts.FindAllTasks(regex, true))
      {          
         if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase) && t.State == TaskState.Ready)
         t.Run();
      }
   }

private static void ChangeTaskEnabledState(string taskName, bool enabled, string hostName)
{
   Regex regex = GetRegexForFindTask(taskName);
   using (TaskService ts = new TaskService(hostName))
   {
      foreach (Task t in ts.FindAllTasks(regex, true))
      {
         if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
         t.Enabled = enabled;
      }
   }

private static Regex GetRegexForFindTask(string taskName)
{
   var regex = new Regex(string.Format(@"{0}", taskName), RegexOptions.IgnoreCase);
   return regex;
}
4

1 回答 1

3

您可以只为该方法提供回调 - 例如

private static void FindTasks(string taskName, string hostName, Action<Task> callback)
{
    Regex regex = GetRegexForFindTask(taskName);

    using (TaskService ts = new TaskService(hostName))
    {
        foreach (Task t in ts.FindAllTasks(regex, true))
            if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
                callback(t);
    }
}

然后调用:

FindTask("SomeTaskName", "SomeHost", (task) => t.Enabled = true);

显然,尽管您的FindTask实现看起来略有不同(您在某些情况下检查 IsEnabled 等),因此您可以在检查匿名委托的地方使用类似的东西:

FindTask("SomeTaskName", "SomeHost", (task) => 
    { 
        // Check if it is running first
        if(t.IsRunning) t.Enabled = false; 
    });

或者您可以将谓词传递FindTask给过滤列表的方法 - 让我只是挖掘语法..

编辑:会是这样的:

public static void FindTask(string taskName, string hostName, Expression<Func<T, bool>> filter, Action<Task> callback)
{
    Regex regex = GetRegexForFindTask(taskName);

    using (TaskService ts = new TaskService(hostName))
    {
        foreach (Task t in ts.FindAllTasks(regex, true).Where(filter)) // Use linq filter here to narrow down the list of tasks
            if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
                callback(t);
    }
}

并使用:

FindTask("SomeTaskName", "SomeHost", task => task.IsEnabled, (task) => task.IsEnabled = false);

所以它只会在IsEnabled任务上运行回调

显然,您必须想知道您可以将什么放入谓词中!余额由您决定:)

但是,您唯一需要考虑的是,允许另一个用户(可能是第 3 方)使用它可以让他们对任务执行任何他们想做的事情,因为他们会重新获得任务的实例来进行操作。至少在您的原始实现中,您仅限于您指定的操作。(如果它只是供您自己使用/内部使用,这对您来说可能不是问题)

于 2013-03-09T15:38:14.197 回答