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 タスク スケジューラのような特殊なクラスを使用してこれを行う方法はありますか?