私は、メイン サービスからの単純な TCP ハートビートをチェックする監視サービス (Windows サービスの形式) に依存するプロジェクトに取り組んでいます。ハートビートが一定期間検出されない場合、またはメイン サービス プロセスがまったく検出されない場合は常に、新しいプロセスが開始されます。一度に 1 つのメイン サービスのみが実行されるようにするために、新しいインスタンスを開始する前に、同じ名前で現在実行中のすべてのプロセスも閉じます。
私が抱えていた問題は、次のコードに起因していました。
var processes = from p in Process.GetProcessesByName("Acme") select p;
foreach (var process in processes)
{
...
process.Close();
process.WaitForExit(10000);
if (!process.HasExited)
process.Kill();
}
process.Close() メソッドがそのプロセスに関連付けられたすべてのリソースを解放したため、WaitForExit() メソッドは例外をスローしました。クローズ時にメイン サービスでクリーンアップ メソッドを起動したかったので、プロセスをすぐに Kill() したくありませんでした。
私の問題の解決策は、process.Close() の代わりに process.CloseMainWindow() を呼び出すことでした。これは、関連するすべてのクリーンアップ メソッドを呼び出し、WaitForExit() メソッドの後までリソースを解放しませんでした。
この問題に対するよりエレガントな解決策がある場合は、お知らせください。