2016-04-04 17 views
0

私はこのサービスを毎週月曜日の午前4時に実行しなければなりません。グーグルを検索私は、このコードを思い付いた:毎週月曜日に厳密に月曜日に実行されるWindowsサービス4am

Timer ServiceTimer; 
DateTime scheduleTime; 

private void ScheduleRun() 
{ 
    int daySet = (Convert.ToInt16(Settings.Default.DayOfWeekRun) - (int)DateTime.Today.DayOfWeek + 7) % 7; 
    scheduleTime = DateTime.Today.AddDays(daySet).AddHours(Convert.ToDouble(Settings.Default.TimeOfDayRun)); 
    if (daySet == 0 && scheduleTime < DateTime.Now) 
    { 
     scheduleTime = DateTime.Today.AddDays(7).AddHours(Convert.ToDouble(Settings.Default.TimeOfDayRun)); 
    } 
} 

public Airt_Service() 
{ 
    InitializeComponent(); 
    ServiceTimer = new System.Timers.Timer(); 
    ScheduleRun(); 
} 

protected void ServiceTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    TimeSpan ts = new TimeSpan(7, 0, 0, 0); 
    runProcessCode(); 
} 

protected override void OnStart(string[] args) 
{ 
    ServiceTimer.Interval = scheduleTime.Subtract(DateTime.Now).TotalSeconds * 1000; 
    ServiceTimer.Elapsed += new System.Timers.ElapsedEventHandler(ServiceTimer_Elapsed); 
    ServiceTimer.Start(); 
} 

ここに欠けているように見える何?私はすでにそれをデバッグしようとしており、2分間隔で動作するようです。 1週間の間隔(ミリ秒単位)が間違っていますか?

答えて

0

私は自分のスケジューラーを書いていません。 Quartzを使用します。

CRON式を生成するために使用できるjQueryプラグインがあります。

あなたが動作するコードのための私のリポジトリをチェックアウトすることができます
https://github.com/ststeiger/CronSharp

+5

私はこのようなもののために石英を使用しません。私はすでにオペレーティングシステムにあるスケジューラを使用します。 – TomTom

+0

@TomTom:ああ、Windowsスケジューラは、15分の時間で動作し、コンピュータが実際にアイドル状態であることを確認するために、その15分の90%がアイドル状態であることが必要です。毎時のタスクを簡単にスケジュールすることができないスケジューラ/正常に動作します。 –

+0

あまり知らないでください。バッチスクリプトまたは正確な時間のプログラムで待機するまで、実際には十分に正確なスケジュールを立てることができます。少し考えてみましょう。試してみてください。 1週間に1回働くためには、プログラム全体を1週間休止するよりもずっと良いです。私はあなたが言及する行動を見たことがない。 – TomTom

4

Windows Task Schedulerは、週に一度、タスクを実行するのに最適です。理想的には、あなたがやりたいことを実行するコンソールアプリケーションを作成し、月曜日の午前4時にそれを実行するにはsetup a basic taskと書くのが理想的です。

関連する問題