C# の長時間実行プロセッサ アプリを開発するための最良の方法論
-
03-07-2019 - |
質問
さまざまな継続的なタスクを実行するいくつかの異なる C# ワーカー アプリケーションがあります。キューからの電子メールの送信、Web サイトのデータベースから注文データベースへの新しい注文のインポート、データベースのバックアップと復元の作成、OLTP -> OLAP のデータ処理の実行、およびその他の関連タスク。以前は Windows サービスとしてリリースしていましたが、現在は通常のコンソール アプリケーションとしてリリースしています。これらはすべて、私が作成した共通のタスク ランナー フレームワークに基づいており、これには満足していますが、これらの種類のアプリケーションを展開する最適な方法はわかりません。コンソール バージョンが気に入っているのは、迅速かつ簡単で、プログラムのアクティビティと出力をすぐに確認できるためです。欠点は、作業者のコンピュータで複数のコンソール画面が実行されており、煩雑になることです。一方、サービス メソッドのデプロイには時間がかかるようで、メッセージを確認するにはイベント ログを調べる必要があります。これについての経験やコメントは何ですか?
解決
コンソールアプリのアプローチが好きです。コンソール画面を抑制する-unattendedのようなスイッチを渡すことができるように、通常は設定を行います。
他のヒント
Windowsサービスは適切な選択肢です。現在のセッションを閉じてもバックグラウンドで実行されます。また、サーバーでパッチ更新を実行するときにWindowsの再起動後に自動的に開始するように構成することもできます。重要なメッセージをイベントビューアまたはデータベーステーブルに記録できます。
このようなことを行うための標準的な方法は、Windowsサービスを使用することです。サービスをネットワークアカウントで実行して、ログインユーザーを必要としないようにします。
数年前に似たような問題を抱えていたものに取り組みました。論理的にはサービスが必要でしたが、何が起こっているのかを見る必要があり、一般的には履歴が必要でした。そのため、ログを取りたいときはいつでも、そのサービスをサブスクライバーに呼び出すサービスを開発しました(オブザーバーパターンとして実装)。
サービスは独自のデータロガー(データベースへの書き込み)を登録し、実行時に、ユーザーはリモーティングを使用してサービスに接続したGUIを実行し、ライブリスナーになりました!
私は Windows サービスに投票するつもりです。これらのコンソール アプリケーションを管理するのは非常に困難になるでしょう。
Windows サービスの展開は簡単です。最初のインストール後は、それらをオフにして XCOPY を実行するだけです。複雑なインストーラーを実行する必要はありません。初めての場合はやや複雑ですが、その後も
installutil MyApp.exe
最高のセキュリティと他のマシンとの相互運用を容易にするために、ドメイン アカウントで実行されるようにサービスを構成します。
重要な通知にはイベント ログ (エラー、警告、情報を含む) を組み合わせて使用し、詳細なログをテキスト ファイルにダンプするだけです。
すべての世界を最大限に活用して、次のようなものを使用しない理由:
http://topshelf-project.com/
プログラムをコマンドラインまたはWindowsサービスとして実行できます。
これがあなたのアプリケーションに当てはまるかどうかはわかりませんが、ユーザー入力に依存しないいくつかのコンソールアプリケーションがある場合、またはそれらが単に仕事をして終了するようなアプリケーションである場合、そのようなプログラムを実行します仮想サーバーでは、このように作業しているときに画面がポップアップ表示されず、仮想サーバーの作成と再起動が簡単です。
Windowsサービスをバックグラウンドプロセスとして定期的に使用しています。コマンドラインアプリは、実行するためにサーバーにログインする必要があるため、好きではありません。サービスは常にバックグラウンドで実行されます(自動開始であると想定)。また、Windowsにあるsc.exeコマンドラインツールをインストールするのも簡単です。私はinstallutil.exeである肥大化したウェアよりもそれが好きです。もちろん、installutilはもっと多くのことをしますが、何をする必要はありません。サービスを登録したいだけです。
また、インターフェイス定義に基づいて.DLLをロードする汎用サービス.exeがあるインフラストラクチャを作成したため、新しい「サービス」を追加します。新しいDLLをドロップして、サービスホストを再起動するだけです。
しかし、私たちはサービスから離れ始めました。私たちが抱えている問題は、(明らかな理由で)DLLをロックすることです。そのため、それらをアップグレードするのは苦痛です。停止し、アップグレードしてから再起動する必要があります。難しくはありませんが、追加の手順があります。代わりに、特別な「ページ」に移動しています。必要な実際のバックグラウンドジョブを実行するasp.netアプリで。まだサービスはありますが、それが行うのはasp.netページを呼び出すため、DLLをロックしません。その後、asp.net binディレクトリ内のDLLと、アプリケーションドメインの再起動のための通常のasp.netルールを開始します。