1

私は、メイン サービスからの単純な 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() メソッドの後までリソースを解放しませんでした。

この問題に対するよりエレガントな解決策がある場合は、お知らせください。

4

1 に答える 1

4

Process.Close実際のプロセスを終了しません。プロセスにはまったく影響しません。クラスのリソースを解放するだけですProcess(その後、発見したように使用できなくなります)

プロセスを終了する場合は、Process.Killまたはなどの別の方法を使用する必要がありますProcess.CloseMainWindow

Process.Close用途が異なります。クラスインスタンスProcess.Disposeの操作が完了したら、それ (または ) を呼び出す必要があります。Process

于 2011-07-26T16:25:24.500 に答える