5

私はこの答えを見つけ、それに従うように努めましたが、サービスを開始している間、それは私に何の仕事ももたらしませんでした。私が理解できなかったことの1つは、次のとおりです。 `_timer = new Timer(10 * 60 * 1000); //10分ごと

毎日午後10時にサービスを実行したいのですが、どうすればよいですか?

4

4 に答える 4

8

あなたはとのdifference間を見つけて、それに応じて経過間隔を作ることができます。このように、スケジュールされた時間のタイマーのイベント。時間間隔を24時間に設定してください。current timedesired schedule timewill 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);
}
于 2012-08-12T01:26:48.300 に答える
4

独自のタイマーを使用する代わりに、Quartz.NETを使用してサービスをホストできます。それはうまく機能し、キャッチアップ(必要な場合)やサービスをファームする機能などのいくつかの追加機能を備えています。

http://quartznet.sourceforge.net/

于 2012-08-12T01:09:31.983 に答える
3

Windowsには、スケジュールのニーズにはるかに適したタスクスケジューラが組み込まれています。システムの再起動、夏時間などのスケジューリングタスクで作業する場合、うまくいかないことがたくさんあります。

独自のスケジューラを作成する際の問題のいくつかについて、Ayendeのブログを参照できます。 腐ったスケジューリング:自分でロールしないでください

于 2012-08-12T01:02:10.217 に答える
1

タイマーは、参照した回答で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分は、ポーリング頻度として使用される時間です。

于 2012-08-12T00:59:57.507 に答える