標籤:style blog http io ar color os 使用 sp
最近做了一個需要和Windows Schedule task相關的功能,即通過schedule,計算下次跑task的時間。
通過是用第三方的DLL來實現,從下面的網站下載:
http://taskscheduler.codeplex.com/
1. 在Schedule Task裡增加一個task,命名為“testJing”, trigger設定為每五天
增加一個Trigger,如:
2. 使用VS2012,建立一個Console Application,命名為ScheduleTaskDemo
3.添加引用。 從上述的網站下載(http://taskscheduler.codeplex.com/releases/view/120747),解壓後,找到Microsoft.Win32.TaskScheduler.dll(我用的是v4.0檔案夾下的,我建的application的.NET framework 4.5)
4. 開啟program.cs檔案,代碼如下:
方法一:
using Microsoft.Win32.TaskScheduler;
using System;
public static void Main(string[] args)
{
using (TaskService ts = new TaskService())
{
Task task = ts.FindTask("testJing");
DateTime nextRunTime = task.NextRunTime;
Console.WriteLine("NextRunTime:" + nextRunTime);
}
}
NextRunTime 即可擷取下次跑task的時間。
這是直接用Task的屬性NextRunTime,下面是我自己寫的方法擷取next run time.
方法二:使用Task裡的一系列屬性來計算,代碼如下:
public static void Main(string[] args) { try { DateTime? beginDateGMT = null; DateTime? endDateGMT = null; GetDaysInterval(out beginDateGMT, out endDateGMT); if (!beginDateGMT.HasValue || !endDateGMT.HasValue) { throw new Exception("BeginDateGMT(" + beginDateGMT + ") or EndDateGMT(" + endDateGMT + ") is null. Please check schedule setting."); } else { Console.WriteLine("BeginDateGMT:" + beginDateGMT + ", EndDateGMT:" + endDateGMT); } } catch (Exception ex) { throw; } Console.Read(); }
private static void GetDaysInterval(out DateTime? beginDateGMT, out DateTime? endDateGMT) { using (TaskService ts = new TaskService()) { Task task = ts.FindTask("testJing"); TaskTriggerType taskTriggerType = task.Definition.Triggers[0].TriggerType; //// get current day, e.g. 2014/11/10 00:00:00 DateTime nowGMT = DateTime.Now; nowGMT = new DateTime(nowGMT.Year, nowGMT.Month, nowGMT.Day, 0, 0, 0); beginDateGMT = nowGMT; endDateGMT = null; switch (taskTriggerType) { case TaskTriggerType.Daily: DailyTrigger dailyTrigger = task.Definition.Triggers[0] as DailyTrigger; if (dailyTrigger.DaysInterval > 0) { endDateGMT = beginDateGMT.Value.AddDays(dailyTrigger.DaysInterval); } else { throw new Exception("ScheduleType is daily, but daysInterval <= 0."); } break; case TaskTriggerType.Weekly: WeeklyTrigger weeklyTrigger = task.Definition.Triggers[0] as WeeklyTrigger; if (weeklyTrigger.WeeksInterval > 0) { endDateGMT = beginDateGMT.Value.AddDays(weeklyTrigger.WeeksInterval * 7); } else { throw new Exception("ScheduleType is weekly, but weeksInterval <= 0."); } break; case TaskTriggerType.MonthlyDOW: case TaskTriggerType.Monthly: switch (taskTriggerType) { case TaskTriggerType.Monthly: MonthlyTrigger monthlyTrigger = task.Definition.Triggers[0] as MonthlyTrigger; endDateGMT = beginDateGMT.Value.AddMonths(1); break; case TaskTriggerType.MonthlyDOW: MonthlyDOWTrigger monthlyDOWTrigger = task.Definition.Triggers[0] as MonthlyDOWTrigger; if ((monthlyDOWTrigger.WeeksOfMonth == WhichWeek.FirstWeek || monthlyDOWTrigger.WeeksOfMonth == WhichWeek.SecondWeek || monthlyDOWTrigger.WeeksOfMonth == WhichWeek.ThirdWeek || monthlyDOWTrigger.WeeksOfMonth == WhichWeek.FourthWeek || monthlyDOWTrigger.WeeksOfMonth == WhichWeek.LastWeek) && (monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Sunday || monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Monday || monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Tuesday || monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Wednesday || monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Thursday || monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Friday || monthlyDOWTrigger.DaysOfWeek == DaysOfTheWeek.Saturday)) { DateTime nextMonthFirstDay = new DateTime(beginDateGMT.Value.AddMonths(1).Year, beginDateGMT.Value.AddMonths(1).Month, 1, 0, 0, 0); DateTime nextMonthLastDay = nextMonthFirstDay.AddMonths(1).AddDays(-1); if (monthlyDOWTrigger.WeeksOfMonth == WhichWeek.LastWeek) { DayOfWeek? dayOfWeek = GetDayOfWeek(monthlyDOWTrigger.DaysOfWeek); while (nextMonthLastDay >= nextMonthFirstDay) { if (nextMonthLastDay.DayOfWeek == dayOfWeek.Value) { endDateGMT = nextMonthLastDay; break; } nextMonthLastDay = nextMonthLastDay.AddDays(-1); } } else { //// weeksOfMonth: 1,2,3,4; daysOfWeekForMonth:7,1,2,3,4,5,6; int weeksOfMonthInt = 0; switch (monthlyDOWTrigger.WeeksOfMonth) { case WhichWeek.FirstWeek: weeksOfMonthInt = 1; break; case WhichWeek.SecondWeek: weeksOfMonthInt = 2; break; case WhichWeek.ThirdWeek: weeksOfMonthInt = 3; break; case WhichWeek.FourthWeek: weeksOfMonthInt = 4; break; default: weeksOfMonthInt = 0; break; } if (weeksOfMonthInt > 0 && weeksOfMonthInt <= 4) { DayOfWeek? dayOfWeek = GetDayOfWeek(monthlyDOWTrigger.DaysOfWeek); int countDayOfWeek = 0; while (nextMonthLastDay >= nextMonthFirstDay) { if (nextMonthFirstDay.DayOfWeek == dayOfWeek) { countDayOfWeek++; if (countDayOfWeek == weeksOfMonthInt) { endDateGMT = nextMonthFirstDay; break; } } nextMonthFirstDay = nextMonthFirstDay.AddDays(1); } } else { throw new Exception("ScheduleType is monthly, but weeksOfMonth is not between 1 and 4."); } } } else { throw new Exception("ScheduleType is monthly, but weeksOfMonth or daysOfWeekForMonth has multiple values."); } break; default: throw new Exception("ScheduleType is monthly, but scheduleByMonthType is " + taskTriggerType + "."); } break; default: throw new Exception("ScheduleType(" + taskTriggerType + ") is not in (Daily;Weekly;Monthly;)."); } } }
private static DayOfWeek? GetDayOfWeek(DaysOfTheWeek daysOfTheWeek) { DayOfWeek? dayOfWeek = null; switch (daysOfTheWeek) { case DaysOfTheWeek.Sunday: dayOfWeek = DayOfWeek.Sunday; break; case DaysOfTheWeek.Monday: dayOfWeek = DayOfWeek.Monday; break; case DaysOfTheWeek.Tuesday: dayOfWeek = DayOfWeek.Tuesday; break; case DaysOfTheWeek.Wednesday: dayOfWeek = DayOfWeek.Wednesday; break; case DaysOfTheWeek.Thursday: dayOfWeek = DayOfWeek.Thursday; break; case DaysOfTheWeek.Friday: dayOfWeek = DayOfWeek.Friday; break; case DaysOfTheWeek.Saturday: dayOfWeek = DayOfWeek.Saturday; break; default: throw new Exception("ScheduleType is monthly, but daysOfWeek is not between Sunday and Saturday."); } return dayOfWeek; }
運行,即可。結果和方法一是一樣的。
注意:方法二裡,對於Monthly裡,不支援選擇months。自己可自行擴充。
C# Windows Schedule task之擷取task下次已耗用時間