2013-03-09 3 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 방법에 술어를 전달할 수

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

또는 - 그냥 날 보자 것 같은 : ..

편집 구문을 발굴

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

도움 주셔서 대단히 감사합니다. –

관련 문제