C# Windows Schedule task之擷取task下次已耗用時間

來源:互聯網
上載者:User

標籤: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下次已耗用時間

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.