2013-03-09 30 views
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; 
} 

回答

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任務

運行回調明顯那麼你不得不想知道你可以把什麼放入謂詞中!餘額是你的確定:)

但你需要考慮的唯一的事情是,允許其他用戶(第三方也許)使用它允許他們做任何他們想要的任務,因爲他們得到一個實例的任務回到操作。至少在你原來的實現中,你僅限於你指定的操作。 (這可能對您沒有問題,但如果僅供您自己使用/內部使用)

+0

非常感謝您的幫助。 – 2013-03-10 12:39:17