我正在编写一个类,它利用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;
}
答案 0 :(得分: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
任务
显然,你不得不想知道你可以把它放到谓词中!余额由您决定:)
唯一需要考虑的是,允许其他用户(可能是第三方)使用此功能可以让他们对任务执行任何操作,因为他们可以将任务的实例重新运行。至少在您的原始实现中,您仅受限于您指定的操作。 (这对你来说可能不是问题,如果只是为了你自己的使用/内部使用)