最近进行了一次需求和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. 【Android进阶】Gson解析json字符串的简单应用

    在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式, ...

  2. C# The process cannot access the file because it is being used by another process

    C# The process cannot access the file because it is being used by another process   The process cann ...

  3. linux 手动安装 oracle(转)

    Linux下安装Oracle 11 此为参照CU论坛上的高人写的文章并结合自身环境增加了点细节性的东西 操作系统 CentOS 4.2 2.6.11.8内核 安装准备 下载Oracle11安装包 内存 ...

  4. js在以div添加滚动条

    给予div另外,当我们必须定义高度和宽度的滚动条,使滚动条是有效,增加样式:overflow:auto; 版权声明:本文博主原创文章.博客,未经同意不得转载.

  5. S如何解决安卓DK无法下载Package问题

    安装一些用户Android SDK后.打开Android SDK Manager下载API当总是显示"Done loading packages"却迟迟不能前进.自己也出现了这样的 ...

  6. 皮尔逊相似度计算的例子(R语言)

    编译最近的协同过滤算法皮尔逊相似度计算.下顺便研究R简单使用的语言.概率统计知识. 一.概率论和统计学概念复习 1)期望值(Expected Value) 由于这里每一个数都是等概率的.所以就当做是数 ...

  7. MonkenRunner通过HierarchyViewer定位控制的方法和建议(Appium/UIAutomator/Robotium侣)

    1. 背景 正在使用MonkeyRunner当我们经常使用Chimchat下面HierarchyViewer模块获得目标控制的一些信息,以协助我们测试.但在MonkeyRunner官方的说法是没有看到 ...

  8. Apple Watch 1.0 开发介绍 2.1 WatchKit Apps UI要点

    实现app的开始是定义storyboard场景.每个场景定义了app的一部分界面.可以为不同的尺寸自定义场景. 组装storyboard界面 WatchKit app和iOS app的布局模式不同.组 ...

  9. MVC5+EF6 入门完整教程 总目录

    本系列文章会从一个主干开始,逐渐深入,初步规划30篇.初级10篇,中级10篇,综合项目实战10篇 初级10篇 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@201505 ...

  10. 七牛对用户使用webp图片格式的使用建议

    Qiniu 七牛问题解答 Chrome浏览器是可打开WebP格式的.可是并非全部的浏览器都支持webp格式,比如360.ie等浏览器是不支持的. WebP格式,谷歌(google)开发的一种旨在加快图 ...