13

私は、Windows サービスまたはスケジュールされたタスクとして実行される多くのアプリケーションに取り組んできました。

今、私はこれらのアプリケーションがフォールト トレラントで信頼できるものであることを確認したいと考えています。例えば; 私は毎時間実行するサービスを持っています。動作中または実行中にサービスがクラッシュした場合、データの損失を避けるために、同じ期間にアプリケーションを再度実行する必要があります (これには、データ処理のトランザクションを含むいくつかの事柄が関係しています)。さらに、プログラムがエラーを詳細に報告するようにします。私の目標は、データの損失を回避し、プログラムの実行に遅れをとらないようにすることです。

ユーザーがプロジェクトにインポートできるクラス ライブラリを作成しました。ライブラリは、プログラムの実行中のインスタンスの情報を保持することになっています。プログラムは、実行間隔、実行ステータスなどの情報を読み書きします。このデータはデータベースに保存されます。

スケジュールされたタスク/ Windows サービスを耐障害性と信頼性を高めるためのベスト プラクティスがあるかどうか、私は興味がありました。

編集:異なるサーバー上にある独立したタスクまたはサービスについて話しています。私の目標は、サービスが実行され続け、障害があれば報告し、それらから回復できるようにすることです。

4

2 に答える 2

8

他の人の言うことに興味がありますが、私が偶然見つけたいくつかのポイントを紹介します。

  1. 未処理の例外のイベントハンドラを作成します。このようにして、リソースをクリーンアップしたり、ログファイルに書き込んだり、管理者に電子メールを送信したり、クラッシュする代わりに必要なことをすべて行うことができます。

    AppDomain.CurrentDomain.UnhandledException + = new UnhandledExceptionEventHandler(AppUnhandledExceptionEventHandler);

  2. アプリケーションの主要部分で必要なサービスベースイベントハンドラーをオーバーライドします。OnStartとOnStopは非常に重要ですが、使用できるものは他にもたくさんあります。http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase%28v=VS.71%29.aspx

  3. タイマーに注意してください。Windowsフォームタイマーは、サービスでは正しく機能しません。ユーザーSystem.Threading.TimersまたはSystem.Timers.Timer。Windowsサービスで使用するのに最適なタイマー

  4. スレッドで更新する場合は、キーセクションでlock()またはモニターを使用して、すべてがスレッドセーフであることを確認してください。

  5. サービスは特定のユーザーコンテキストなしで実行されるため、ユーザー固有のものを使用しないように注意してください。一部のSQL接続文字列がWindowsの認証などで機能しなくなっていることに気付きました。また、マップされたドライブで問題が発生している人もいます。

  6. UIを使用してサービスを作成しないでください。実際、Vistaと7の場合、とにかく実行することはほぼ不可能です。ユーザーの操作は必要ありません。できることのほとんどは、WIN32関数を使用してメッセージを送信することです。MSDNは、インタラクティブサービスを作成することは悪い習慣であると主張しています。http://msdn.microsoft.com/en-us/library/ms683502%28VS.85%29.aspx

  7. デバッグの目的で、サービスをコンソールアプリケーションとして実行し、目的の処理を実行できるようにするのは非常に便利です。素晴らしいチュートリアル: http: //mycomponent.blogspot.com/2009/04/create-debug-install-windows-service-in.html

とにかく、それが少し役立つことを願っていますが、それは私が自分で見つけたいくつかのことです。

于 2010-05-27T18:37:09.360 に答える
0

明らかなこと - すべてのタスクを同時に実行しないでください。いつでも 1 つのタスクだけが高価なリソースを使用するようにスケジュールを設定してください (可能な場合)。たとえば、ニュースレターや特定の通知を送信する必要がある場合は、それらを別の時間にスケジュールします。2 つのタスクでデータベース内の何かをクリーンアップする必要がある場合は、1 つのタスクを次々に実行します。

また、タスクを通常の営業時間外 (明らかに夜間) に実行するようにスケジュールします。

于 2010-05-27T16:29:15.840 に答える