C# アプリケーションを使用して Java Web アプリケーションを起動しています。ユーザーがいつ Java アプリケーションを終了したかを C# アプリケーションに認識させたいと考えています。私はこのコードを使用しています:
var javaws = File.Exists(@"C:\Program Files\Java\jre6\bin\javaws.exe") ? @"C:\Program Files\Java\jre6\bin\javaws.exe" : @"C:\Program Files (x86)\Java\jre6\bin\javaws.exe";
var psi = new ProcessStartInfo(javaws, String.Format("http://{0}:/appstart.jnlp", hostAddress));
Process.Start(psi).WaitForExit();
このコードは Java プログラムを正常に起動しますが、WaitForExit()
呼び出されてすぐに戻ります。これは、「javaws」が単に「javaw」という別のプロセスを開始してから「javaws」を閉じるためだと思います。A) すべての子プロセスも終了するのを待つ方法、または B) 特定の子プロセスを待つ方法はありますか?
--
この関連記事を発見しました: Javaws 終了コードは本当に壊れていますか? 、そこの答えは1.6.0_23がそれを修正したことを示唆していますが、Java 1.6.0_23を使用した開発マシンでまったく同じ動作が見られます。私が今探しているのは、上記のコードを期待どおりに機能させるための回避策です。この jnlp ファイルを開始し、その実行が完了するまで待ってから、C# プログラムで追加のコードを実行する必要があります。Java アプリケーションは制御できないので、そこに機能を追加することはできません。
--
疑問に思っている人にとっては、最終的な解決策は次のようになります。
var javaws = File.Exists(@"C:\Program Files\Java\jre6\bin\javaws.exe") ? @"C:\Program Files\Java\jre6\bin\javaws.exe" : @"C:\Program Files (x86)\Java\jre6\bin\javaws.exe";
var psi = new ProcessStartInfo(javaws, String.Format("http://{0}:/appstart.jnlp", hostAddress));
Process.Start(psi).WaitForExit();
var javaw = Process.GetProcessesByName("javaw");
javaw.Single(ja => ja.StartTime.Equals(javaw.Max(j => j.StartTime))).WaitForExit();
javaw
これにより、マシンで他の Java Web アプリが実行されている場合に、最後に開始されたプロセスのみを待機するという追加の利点が提供されます。