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タスクに対してのみコールバックを実行します

明らかに、あなたはあなたが述語に何を入れることができるのか疑問に思う必要があります!バランスはあなた次第です:)

ただし、考慮する必要がある唯一のことは、別のユーザー(サードパーティなど)がこれを使用できるようにすると、タスクのインスタンスを操作できるようになるため、タスクに対してやりたいことが何でもできるようになるということです。少なくとも元の実装では、指定した操作だけに制限されます。(これは、あなた自身の使用/内部使用のためだけの場合でも、あなたにとって問題ではないかもしれません)

于 2013-03-09T15:38:14.197 に答える