さまざまなケースをカバーする最も堅牢なソリューションは、ワーカープロセスを開始および停止できるウォッチドッグプロセスを使用することです。WCFを使用して、プロセス間でシグナル(またはその他の情報)を送受信します。アイデアは、ウォッチドッグプロセスを単純に保ち、限られた一連のタスクの実行中に失敗する可能性がほとんどないようにすることです。次に、すべての危険なロジックをワーカープロセスに配置します。
障害またはワーカープロセスの状態をウォッチドッグプロセスに伝達するためのプロトコルを考え出します。ここにいくつかのアイデアがあります。このリストは、完全なリストではありません。
- ウォッチドッグは、ステータスレポートをタイムリーに受信しない場合、ワーカープロセスを再開します。
- ウォッチドッグは、障害ステータスレポートを受信すると、ワーカープロセスを再開します。
- ウォッチドッグは、メモリリークを検出すると、ワーカープロセスを再開します。
- ウォッチドッグは、実行されていない場合、ワーカープロセスを開始します。
最後の項目を除いて、Windowsサービスコントロールマネージャーは他の3つのケースを処理できません。これが、ウォッチドッグプロセスのアイデアが好きな理由の1つです。もう1つの理由は、メインロジックがブロッキング呼び出しでハングアップする可能性があるためです。状態が破損するためお勧めしませんのでThread.Abort
、とにかくワーカープロセスを強制終了する以外に選択肢はほとんどありません。
また、メインロジックを可能な限りフォールトトレラントにするようにしてください。そうすれば、強制的に終了する必要がある場合に、残された混乱を回復してクリーンアップするのがはるかに簡単になります。これは、DBトランザクションや巧妙なファイル操作などのアトミック操作を使用することを意味する場合があります。