私はこの答えを見つけ、それに従うように努めましたが、サービスを開始している間、それは私に何の仕事ももたらしませんでした。私が理解できなかったことの1つは、次のとおりです。 `_timer = new Timer(10 * 60 * 1000); //10分ごと
毎日午後10時にサービスを実行したいのですが、どうすればよいですか?
私はこの答えを見つけ、それに従うように努めましたが、サービスを開始している間、それは私に何の仕事ももたらしませんでした。私が理解できなかったことの1つは、次のとおりです。 `_timer = new Timer(10 * 60 * 1000); //10分ごと
毎日午後10時にサービスを実行したいのですが、どうすればよいですか?
あなたはとのdifference
間を見つけて、それに応じて経過間隔を作ることができます。このように、スケジュールされた時間のタイマーのイベント。時間間隔を24時間に設定してください。current time
desired schedule time
will fire once
private System.Timers.Timer _timer;
private void SetTimer()
{
DateTime currentTime = DateTime.Now;
int intervalToElapse = 0;
DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 10,0,0);
if (currentTime <= scheduleTime)
intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds;
else
intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds;
_timer = new System.Timers.Timer(intervalToElapse);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
}
void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//do your work
_timer.Interval = (24 * 60 * 60 * 1000);
}
独自のタイマーを使用する代わりに、Quartz.NETを使用してサービスをホストできます。それはうまく機能し、キャッチアップ(必要な場合)やサービスをファームする機能などのいくつかの追加機能を備えています。
Windowsには、スケジュールのニーズにはるかに適したタスクスケジューラが組み込まれています。システムの再起動、夏時間などのスケジューリングタスクで作業する場合、うまくいかないことがたくさんあります。
独自のスケジューラを作成する際の問題のいくつかについて、Ayendeのブログを参照できます。 腐ったスケジューリング:自分でロールしないでください
タイマーは、参照した回答で10分ごとにポーリングしていますが、1日に1回だけ処理されます。
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// ignore the time, just compare the date
if (_lastRun.Date < DateTime.Now.Date)
{
午前10時に発生させるには、次のような別の条件を追加します。
_lastRun.Date <DateTime.Now.Date && DateTime.Now.Hour = 10
10分は、ポーリング頻度として使用される時間です。