最近进行了一次需求和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下一步执行时间的更多相关文章

  1. 【点滴积累,厚积薄发】windows schedule task的最小时间间隔是多少?

    在一些业务系统中,经常会出现一些需要定时运行的任务,业界已有很多优秀的选择,比如windows schedule task,Quartz等等.在以前在新蛋的时候用的是内部封装的JobConsole,非 ...

  2. C# Task 多任务 限制Task并发数量

    LimitedTaskScheduler: using System; using System.Collections.Concurrent; using System.Collections.Ge ...

  3. 【C# Task】理解Task中的ConfigureAwait配置同步上下文

    原文:https://devblogs.microsoft.com/dotnet/configureawait-faq/ 作者:Stephen 翻译:xiaoxiaotank 静下心来,你一定会有收获 ...

  4. Task.Run Vs Task.Factory.StartNew

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  5. Task.Run Vs Task.Factory.StartNew z

    在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...

  6. MapReduce作业的map task和reduce task调度参数

    MapReduce作业可以细分为map task和reduce task,而MRAppMaster又将map task和reduce task分为四种状态: 1.pending:刚启动但尚未向reso ...

  7. C# Task的使用---Task的启动

    .NET 4.0包含的新名称空间System.Threading.Tasks,它包含的类抽象出了线程功能.任务表示应完成的某个单元的工作.这个单元的工作可以在单独的线程中运行,也可以以同步的方式启动一 ...

  8. .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法

    前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...

  9. 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。

    一. Task的各种返回值-Task<TResult> PS: 在前面章节,我们介绍了Task类开启线程.线程等待.线程延续的方式,但我们并没有关注这些方式的返回值,其实他们都是有返回值的 ...

随机推荐

  1. fedora linux平台下搭建lighttpd+php+sqlite

    (一)lighttpd 1. 安装 yum install lighttpd 安装完毕后,系统中应该多了一个用户lighttpd和组lighttpd.这个用户,默认是不同意登陆的. 我们改动/etc/ ...

  2. ADO.NET连接方式

    使用Command.DataReader和DataSet两种方法实现数据绑定 方法1:使用Command和DataReader SqlConnection con = new SqlConnectio ...

  3. #define XXX do{ XXX } while(0) 为什么使用

    #define XXX do{ XXX } while(0) 为什么使用 时常会遇到一个非常"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪) 近期又遇到这 ...

  4. BP神经网络的基本原理

    2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点.经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网 ...

  5. 【Web探索之旅】第三部分第二课:IP地址和域名

    内容简介 1.第三部分第二课:IP地址和域名 2.第三部分第三课预告:协议 第三部分第二课:IP地址和域名 上一课我们说了在Web之中,全球各地有无数台机器,有些充当客户机,有些作为服务器. 那么这些 ...

  6. Lua 脚本语法说明(转)

    Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得 ...

  7. iOS开展-clang: error: unknown argument: &#39;-websockets&#39;解决方案

    问题: 昨天莫名其妙Xcode自己主动升级,那么今天之前执行project什么时候,不知怎的,他们都获得了. 错误内容: clang: error: unknown argument: '-webso ...

  8. oracle 选择最频繁出现之前,5文章数据

    SELECT * FROM ( SELECT PROJECT_LISTING.MATERIAL, COUNT (*) AS "出现次数" FROM PROJECT_LISTING ...

  9. Principle使用教程

    本次分享主要有以下几点内容: 1.初识界面2.两个关键操作3.案例一:滑动4.案例二:点击跳转 5.案例三:跟随动画(抽屉效果) 1初识界面Principle的界面与Sketch基本一致,如下图: a ...

  10. Make a dent in the universe

    李自成<一个数学家平反>.就像我第一次读同一,我感到鼓舞的野心文."野心是世界的驱动力的最好的结果几乎所有的工作. " 心野心是要留下点什么在自己身后的永恒价值 在这个 ...