(Win/C#/.Net) アプレットは 1 時間間隔でポーリングする必要があります - 最良の方法に関する推奨事項はありますか?
質問
アプレットは、ディレクトリの存在をたとえば 1 ~ 4 時間ごとにポーリングし、見つからない場合はいくつかの電子メール/NET SEND を送信する必要があります。正確な間隔はまだわかりませんが、1 時間を下回ることは間違いありません。全体的な「ジョブ」は永続的で、近い将来にわたって継続的に実行されます。アプレットは Win2k3 サーバー上で実行され、(非常に軽い) ユーザーの使用パターンに基づくと、プライマリ サーバーの機能に目立った干渉を与えるとは思えませんが、もちろん、適切に動作することを望んでいます。最終的には Win Service として実装することも検討しましたが、さまざまな理由により、最初の実装はコンソール アプリとして行われます。
システム リソース、特に CPU と RAM の使用に関して最も無駄のない実装を求めます。 最も懸念されるのは、タイミング/ポーリングの実装とCPU使用率。 大量のオブジェクトや GUI などはありません。作成されるため、RAM の使用量はそれほど問題にはなりませんが、長時間実行される .exe (数か月/数年という意味で) としてガベージ コレクションを実装する場合、ガベージ コレクションについて特別な考慮を払う必要がありますか?
ファイルシステムウォッチャー?
System.Timers.Timer?
スレッド。寝る?
他の?
実際、これを書いているときに、この種のタスク用にすでに発明されている多くの既存の「ホイール」を再利用するという観点から見ると、最も単純な実装は、ポーリングをまったく行わず、単に開始するように設計するだけであることに気づきました。アクションを実行して閉じ、Windows スケジュールされたタスク インフラストラクチャにタイミング面を処理させます。しかし、私はとにかく、そのアイデアの検証と将来の参考のための一般的な情報を得るために投稿しました。ティ!
解決
Windowsのスケジュールされたタスクは間違いなく行く方法です。そして、のThread.sleep(n)は間違いなく行くには、のないの方法です。 System.Timers.Timer
は、各Elapsedイベントで3600000.の初期間隔で、あなたのアプリケーション内からこれをやろうとしていた場合、あなたは再度有効に、あなたがする必要がどのようなコードを実行し、タイマーを無効にする必要があります行くための方法だろう次のオン時間の時間マイナス現在のシステム時間に等しい間隔でタイマー。 (これはそれで地獄にいる場合は、あなたの目的のために重要ではないかもしれませんが)そうでなければ、あなたのタイマーは、システム時刻と同期してドリフトします。
他のヒント
を使用するWindowsのスケジュールサービスは、あなたのコンソールアプリケーションの実行をスケジュールします。 Directory.Existsを使用して、ディレクトリのための簡単なチェックを行い、必要に応じて電子メールを送ってます。
私はそれが(イベントログまたはお好みのシンクにログインする)ヘッドレスアプリケーションとして実行するように設計し、タスクスケジューラはそのジョブを実行し、時間にそれを呼び出すせて行くと思います。
物事をovercomplicateする必要はありません。
過去には私は単純にコンソールアプリケーションを作成し、それがWindowsのスケジュールされたタスクから実行することによって、そのようなタスクを処理してきました。そうすれば、それはそのアクションを実行して、メモリからアンロードすることができます。また、(システムのアップグレードなど)のサーバーに行われる必要がある仕事があるかどう一時的にスケジュールされたタスクを無効にするのは簡単です。また、それはスケジュールが(もっと/少ないことが多い)を変更する必要があり、スケジュールされたタスクインタフェースはすでに複数の実行を占めています。
私たちは、いくつかの理由から Windows サービスと同様のツール (将来実装される可能性があるとおっしゃいました) を作成しようとしました。
- NET.EXE (最終的には PowerShell) によるシンプルなリモート管理
- による簡単なモニタリング システムセンター運用マネージャー (旧MOM)
- 必要に応じてデータ/オブジェクトをキャッシュできます
- 標準化
これらのプロジェクトを作成するためのフレームワークと関連テンプレートを開発したことに注意してください。そうすることで、各プロジェクトがポーリング間隔などの構成を処理する必要がなくなります。