2

作業プロジェクトでは、24時間年中無休で実行されるC#.NETWindowsサービスを作成するタスクを実行しています。プログラムは基本的に、HTTP、ネットワークパス、FTPなどのさまざまな場所間でファイルを(特定のパスと正規表現に基づいて)移動するだけです。管理者は、ASP.NETの管理ページを介してこれらのジョブをスケジュールします。このページでは、すべてのジョブがデータベースに保存されます。一見最も難しい部分は、これらのジョブをスケジュールすることです-タスクを特定の時間に特定の日に実行するようにスケジュールすることは非常に簡単ですが、タスクを毎日、毎週、特定の日に実行できるように十分に堅牢である必要もありますその月の、あるいは数秒/分ごとですら。このスケジューリング情報を保存する最も簡単な方法は、データベースでcron構文(http://adminschoice.com/crontab-quick-reference)を使用することであると結論付けました。

アプリケーションには、データベースの変更を10分ごとにチェックするタイマーがありますが、私が抱えている主な問題は、実行するタスクを取得することです。1つのオプションは、10分ごとにすべてを取得し、個々の行をチェックすることだと思います。それらが実行される予定であるかどうかを確認します。しかし、これは非常に非効率的で技術的に怠惰な方法だと思います。

Windowsのスケジュールされたタスクの方がはるかに簡単な方法であることは知っていますが、上司はそれを望んでいないようです。

いくつかのヒント/アドバイスを提供できる人に事前に感謝します。

4

2 に答える 2

0

追跡する必要があるタスクの数がそれほど多くない場合は、メモリ内のすべてのタスクの優先キューを維持できます。ノードには、(データベースからの) レコード キーと、計算された次の更新日時が含まれます。

プログラムが起動したら、データベースからすべてのレコードを読み取り、優先キューを作成します。キューが構築されたら、最初の項目の日付を確認し、その時刻に起動するようにタイマーを設定します。タイマーが起動したら、現在予定されているすべてのタスクを実行し、次の更新日時に合わせてスケジュールを変更し、更新が必要な次の項目を見つけて、その時間になったときに起動するようにタイマーを設定します。

変更を処理するために、変更を加えてサービスに通知する Web アプリケーションを使用することもできます。既存のタイマーをキャンセルして再スケジュールする必要がありますが、起動時以外はデータベース全体を読み取る必要はありません。

とはいえ、@Oded に同意します。上司に Windows スケジュール タスクを使用するよう説得してください。彼がそのインターフェイスを気に入らない場合は、Web アプリ (または Web アプリが通信するサービス) に Windows タスク スケジューラ API と通信させることができます。Codeplex にはラッパーがあります: http://taskscheduler.codeplex.com/

于 2010-09-27T22:35:52.510 に答える
0

Quartz.NETを見てください- ほとんどの場合、あなたが望むことを正確に行います。Cron 式を使用してスケジュールすることもできます。

各ジョブに関する十分な情報をデータベースに保存すると、サービスが開始されるたびにジョブを作成できます。変更を定期的にポーリングして、ジョブのルールを更新できます。

これをWindowsサービスでホストするのは良い方法です.実行中を監視し、失敗した場合に再起動する標準メカニズムを提供します(net start xxx)など.スケジュールされたタスクよりもはるかに優れています.

于 2010-09-27T22:41:14.347 に答える