ユーザーがスケジュールできる Windows サービスを作成したいと考えています。つまり、ユーザーは毎日午前 9 時から午後 6 時までサービスを実行するか、夜の 12 時から翌日の朝 6 時まで毎晩実行するかを選択できます。これを行うのに役立つボックス.NET API? スケジュールされたタスクを使用してこれを行うことができることは知っていますが、これをプログラムで行う方法はありますか?
5 に答える
Quartz.NETを使用して Windows サービス内でスケジュールされたタスクを実行することで、良い結果が得られました。単純な間隔のスケジューリングから cron スタイルのスケジュールまで、すべてを実行できます。
私の最初の回答は、なぜサービスなのかという質問です。しかし、もっと重要なことは、オペレーティング システムが提供する強力なスケジューラを使用しない理由があるということです。
つまり、Windows サービスは、アプリケーションが実行されるスレッドにすぎません。2 つの部分に分けて出荷できます。1 つ目は、タイマーで実行されるサービス自体です。サービスの起動時にレジストリ値をチェックして、サービスの実行頻度を決定できます。
サービスの 2 番目の部分は、ユーザーがスケジュールを設定できる小さな Windows アプリであり、もちろん、前述のレジストリ値に書き込みます。
必要な特別な API はありません。
ユーザーがタスク スケジューラを操作する必要がないようにするには、ユーザーがプログラムを実行する日時を選択できるようにするプログラムを作成し、スケジュールされたタスクをプログラムでセットアップする必要があります。そうすれば、実行中のプロセスについて具体的に知る必要がなく、タスク スケジューラの使用方法を知る必要もありません。彼らはあなたのアプリからすべてを行うだけです。
スケジューリングを管理するために crontab アルゴリズムを使用して、いくつかの無人サービス (C# で記述された Windows サービス) を実装しました。パターンは強力で柔軟です。cron 式を使用するだけで、いつでもスケジュールを作成できます。私が間違っているかもしれませんが、cron がカバーしていないと私が思う唯一のスケジュールは、月の最終日が必要な場合ですが、これはすべてのサービスの要件ではありませんでした。
インターネットの記事 (Atif Aziz によるオープン ソース) から cron アルゴリズムをコピーし、ユーティリティ クラスに実装して、何年もの間、美しく機能しました。
私のブログで詳細を参照してください: CronTab スケジュール パーサー アルゴリズム
乾杯!
ロベルト
スケジュールする場合は、コンソール プログラムを作成し、ユーザーが Windows でスケジュールされたタスクをセットアップするのに役立つコードをインストーラーに追加するだけです。