我创建了一个易于使用的简单调度程序,不需要使用外部库。 TaskScheduler是一个单引擎,它保持对定时器的引用,因此定时器不会被垃圾收集,它可以安排多个任务。您可以设置在第一次运行(小时和分钟),如果在安排这一次的时间超过在当时的第二天这个计划的开始。但是定制代码很容易。
安排新的任务是如此简单。例如:在11:52,第一个任务是每15个分支,第二个分支是每个5个分支。对于日常执行,将24设置为3参数。
TaskScheduler.Instance.ScheduleTask(11, 52, 0.00417,
() =>
{
Debug.WriteLine("task1: " + DateTime.Now);
//here write the code that you want to schedule
});
TaskScheduler.Instance.ScheduleTask(11, 52, 0.00139,
() =>
{
Debug.WriteLine("task2: " + DateTime.Now);
//here write the code that you want to schedule
});
我的调试窗口:
task2: 07.06.2017 11:52:00
task1: 07.06.2017 11:52:00
task2: 07.06.2017 11:52:05
task2: 07.06.2017 11:52:10
task1: 07.06.2017 11:52:15
task2: 07.06.2017 11:52:15
task2: 07.06.2017 11:52:20
task2: 07.06.2017 11:52:25
...
只需将该类添加到您的项目:
public class TaskScheduler
{
private static TaskScheduler _instance;
private List<Timer> timers = new List<Timer>();
private TaskScheduler() { }
public static TaskScheduler Instance => _instance ?? (_instance = new TaskScheduler());
public void ScheduleTask(int hour, int min, double intervalInHour, Action task)
{
DateTime now = DateTime.Now;
DateTime firstRun = new DateTime(now.Year, now.Month, now.Day, hour, min, 0, 0);
if (now > firstRun)
{
firstRun = firstRun.AddDays(1);
}
TimeSpan timeToGo = firstRun - now;
if (timeToGo <= TimeSpan.Zero)
{
timeToGo = TimeSpan.Zero;
}
var timer = new Timer(x =>
{
task.Invoke();
}, null, timeToGo, TimeSpan.FromHours(intervalInHour));
timers.Add(timer);
}
}
该链接的问题似乎表明,您的运行应用程序中的方法必须定期调用。是这样吗?它会影响您是否需要进行中调度或是否只能使用Windows调度程序。 – paxdiablo 2010-07-14 04:21:57
我的程序会根据需求连续运行 – Vimvq1987 2010-07-14 04:24:25
嘿,我不敢相信你称我的答案“丑陋”。他们的斗争'的话:-) – paxdiablo 2010-07-14 04:39:13