我有一个 Windows 服务,我需要在特定的计划中运行一个方法。到目前为止,我实现了一个代表时间表的类。
public class SchaduleTime
{
public int Hour { get; set; }
public int Minute { get; set; }
public DateTime Next
{
get
{
var now = DateTime.Now;
var dt = now.Date;
// the time has passed to execute today?
if (Hour * 60 + Minute < now.Hour * 60 + now.Minute)
{
dt = dt.AddDays(1);
}
return new DateTime(dt.Year, dt.Month, dt.Day, Hour, Minute, 0);
}
}
}
我创建了一个具有以下字段的主类:
System.Timers.Timer timer;
private SchaduleTime[] schadules;
并在计时器字段的 Elapsed 事件中运行类似的内容:
private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// do my work.
// programing next:
var nowTicks = DateTime.Now.Ticks;
// get the next schadule.
var next = schadules
.Select(s => new
{
Schadule = s,
IntervalNeeded = s.Next.Ticks - nowTicks
})
.OrderBy(o => o.IntervalNeeded)
.First();
timer.Enabled = false;
timer.Stop();
timer.Interval = (int) new TimeSpan(next.IntervalNeeded).TotalMilliseconds;
timer.Enabled = true;
timer.Start();
}
对我来说,这似乎是一个杂乱无章的策略或意大利面条代码,我的意思是看起来很难看。
有没有办法使用与调度一起使用的专用类或.net 中的 Windows 任务调度程序之类的东西来做到这一点,或者我的方法很好,我吓坏了?