我創建了一個易於使用的簡單調度程序,不需要使用外部庫。 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