사용하기 쉽고 외부 라이브러리를 사용할 필요가없는 간단한 스케줄러를 만들었습니다. TaskScheduler는 타이머에 대한 참조를 유지하는 싱글 톤이므로 타이머가 가비지 수집되지 않고 여러 작업을 예약 할 수 있습니다. 스케줄링시이 시간이 초과되면 첫 번째 실행 (시간 및 분)을 설정할 수 있습니다.이 시간이 다음날 스케줄링 시작됩니다. 그러나 코드를 사용자 지정하는 것은 쉽습니다.
새 작업을 예약하는 것은 매우 간단합니다. 예 : 11:52에 첫 번째 작업은 15 초마다, 두 번째 예는 5 초마다입니다. 매일 실행하려면 24를 3 매개 변수로 설정하십시오.
TaskScheduler.Instance.ScheduleTask(11, 52, 0.00417,
() =>
{
Debug.WriteLine("task1: " + DateTime.Now);
});
TaskScheduler.Instance.ScheduleTask(11, 52, 0.00139,
() =>
{
Debug.WriteLine("task2: " + DateTime.Now);
});
내 디버그 창 :
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);
}
}